You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 23:06:05