DRF访问测试接口报Product类缺少objects属性的AttributeError
报错根因
当前views.py模块内存在命名覆盖冲突:
- 导入语句
from .models import Product引入的是你定义的Django数据库模型类,这类类自带ORM提供的objects管理器,支持执行数据库查询 - 后续你又在同文件中定义了一个继承自
APIView的自定义类,同样取名为Product
Python按照自上而下的顺序加载模块内的对象,后面定义的同名类会完全覆盖之前导入的同名内容。当在视图的get方法中调用Product.objects.all()时,代码实际指向的已经是自定义的APIView类,而非数据库模型,自然会抛出“类型对象'Product'不存在objects属性”的错误。
除了核心的命名冲突,现有代码还存在三处会触发后续报错的问题:
serializers.py未导入DRF的序列化基类和对应的Product模型,类定义不完整- 初始化序列化器时传入的是包含多个模型实例的查询集(
QuerySet对象),但没有指定many=True参数,DRF无法正确完成多对象序列化 - 视图返回时直接传入了序列化器实例,而非序列化处理后的
serializer.data,不符合Response类的传参要求
修复方案
- 为视图类重新命名,避开与模型类的重名冲突,可选用
ProductListView这类符合REST接口语义的名称 - 补全序列化器的必要导入逻辑
- 多对象序列化场景添加
many=True参数 - 响应返回时传入序列化处理后的实际数据
修正后的views.py
from rest_framework.views import APIView from rest_framework.response import Response from .serializers import ProductSerializer from .models import Product # 原与模型重名的Product视图类更名为ProductListView class ProductListView(APIView): def get(self, request, format=None): # 此时Product指向模型类,可正常调用ORM查询方法 products = Product.objects.all() # 处理多对象查询集必须指定many=True serializer = ProductSerializer(products, many=True) # 返回序列化后的实际数据,而非序列化器实例 return Response(serializer.data)
修正后的urls.py
from django.urls import path from . import views urlpatterns = [ # 路由指向修改后的视图类 path('test', views.ProductListView.as_view()) ]
修正后的serializers.py
from rest_framework import serializers from .models import Product class ProductSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Product fields = ['name', 'price', 'description']
内容的提问来源于stack exchange,提问作者Arpit Linux
相关产品推荐
相关产品推荐

