【问题标题】:Original exception text was: 'QuerySet' object has no attribute 'name' using django rest framework原始异常文本是:'QuerySet' 对象没有使用 django rest 框架的属性'name'
【发布时间】:2020-07-24 11:57:37
【问题描述】:

我正在学习 Django,但遇到了这个错误,我找不到解决方案。

这是我的模型

class Retailer(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    website = models.CharField(max_length=255)

    def __str__(self):
        return str(self.id)

class Product(models.Model):
    id = models.AutoField(primary_key=True)
    price = models.IntegerField(default=None, null=True)
    name = models.CharField(max_length=255)
    retailer = models.ForeignKey(Retailer,on_delete=models.CASCADE,related_name='retailer_info')
    is_active = models.BooleanField(default=False)
    def __str__(self):
        return str(self.id)

这是我的序列化程序

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

class RetailerSerializer(serializers.ModelSerializer):
    products = ProductSerializer(many=True, read_only=True)
    class Meta:
        model = Retailer
        fields = ['name', 'website', 'products']

这是我的观点

class RetailerList(APIView):
    def get(self, request):
        retailer = Retailer.objects.all()
        serializer = RetailerSerializer(retailer)
        return Response(serializer.data)

这是我的网址

path('retailer', views.RetailerList.as_view()),

但是当我在 127.0.0.1:8000/retailer 上提交获取请求时,我收到此错误:

/product 处的 AttributeError 尝试在序列化程序 RetailerSerializer 上获取字段 name 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 QuerySet 实例上的任何属性或键都不匹配。 原始异常文本是:“QuerySet”对象没有属性“名称”。 有什么问题?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您应该在RetailerSerializer 中添加many=True,因为您不是序列化单个元素,而是一系列元素。此外,您应该例如将其返回为 aJsonResponse:

    from django.http import JsonResponse
    
    class RetailerList(APIView):
        def get(self, request):
            retailer = Retailer.objects.all()
            serializer = RetailerSerializer(retailer, many=True)
            return JsonResponse({'data': serializer.data})

    【讨论】:

    • 错误已修复,非常感谢。对不起,我占用了您的时间,我该如何回应每个零售商的产品?
    • @ValaKhosravi: 因为related_nameretailer_info,所以在fieldsfields 中应该是retaler_info,在你的序列化器的字段中。但是您可能误解了related_namerelated_namereverse 中关系的名称,因此您可能想将ForeignKey 中的related_name 更改为'products'
    • 再次感谢您。我真的不知道在哪里可以找到 Django rest 框架的好教程。
    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 2016-06-30
    • 2021-08-05
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多