【问题标题】:Using ModelSerializer with DRF and Class-based View returns Attribute Error将 ModelSerializer 与 DRF 和基于类的视图一起使用会返回属性错误
【发布时间】:2014-09-14 17:07:36
【问题描述】:

我刚开始使用 DRF,我发现自己有点挣扎。我正在尝试创建一个使用模型序列化程序的基于类的视图。但是,无论我尝试什么,我都会不断收到此错误:

'QuerySet' 对象没有属性'code'

我的模型确实有这个属性,并且我已经确认查询集(当作为值转储时)也有这个属性。

models.py

class Category(models.Model):
    code = UUIDField(unique=True)
    name = models.CharField(max_length=100, null=True, blank=True, unique=True)
    parent_cat = models.ForeignKey('self', null=True, blank=True)

    def __unicode__(self):
        return self.name

urls.py

urlpatterns = patterns('', url(r'^', views.CatView.as_view()))

views.py

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category 

class CatView(APIView):
    def get(self, request, format=None):        
        queryset = Category.objects.all()
        serialized = CategorySerializer(queryset)

        return Response(serialized.data)

如果我转储 Category.objects.all() 调用的输出,我会看到以下数据:

[{'id': 1, 'code': '7889022e-4e03-4c27-860a-f07c2477db0c', 'parent_cat_id': None, 'name': 'Women'}, {'id': 2, 'code': '167c2578-b747-41f5-b2ad-1aa7e3f63952', 'parent_cat_id': 1, 'name': 'Clothing'}, {'id': 3, 'code': '176e0db1-1a4a-4cd3-a6f3-0cac07ab748c', 'parent_cat_id': 1, 'name': 'Dresses'}]

所以我至少可以验证数据是否正确地从我的模型中出来。但是,当我尝试返回响应时,我看到以下错误:

AttributeError at /category/ 
'QuerySet' object has no attribute 'code'

从我所看到的一切来看,我可以说它确实具有该属性。我哪里出错了?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    错误消息是正确的:QuerySet 没有code 属性,只有单个 Category 实例有。

    当您将查询集传递给序列化而不是实例时,您需要告诉它您正在给它一个集合,如tutorial 所示:

    serialized = CategorySerializer(queryset, many=True)
    

    您确实应该阅读该教程:除了向您展示您做错了什么之外,它还向您展示了更好的方法(通过使用 mixins 或通用视图)。

    【讨论】:

    • 非常感谢!我现在要去复习教程。
    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 2013-05-01
    • 2023-02-04
    • 2019-02-11
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2023-02-15
    相关资源
    最近更新 更多