首页 > 解决方案 > 编写 Get 函数给我一个属性错误

问题描述

这是我的models.py

class Grade(models.Model):
    grade = models.CharField(max_length=255, primary_key=True)

这是我执行get的观点(不需要post,如果也需要postmethood,我也可以运行)。

class GetGrade(generics. GenericAPIView):
    '''
    GET check/
    '''
    queryset = Grade.objects.all()
    serializer_class = DataSerializer


    def get(self, request, *args, **kwargs):
        a_grade = Grade.objects.all()
        return Response(
            data=DataSerializer(a_grade).data,
            status=status.HTTP_200
        )

我的序列化程序如下:

class DataSerializer(serializers.ModelSerializer):
    class Meta:
        model = Grade
        fields = ("grade",)

一切似乎都很简单。我可能正在做一些愚蠢的事情。

AttributeError at /check/
Got AttributeError when attempting to get a value for field `grade` on serializer `DataSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `QuerySet` instance.

原始异常文本是:

'QuerySet' object has no attribute 'grade'.
    Request Method: GET
    Request URL:    http://127.0.0.1:8000/check/
    Django Version: 2.1.5
    Exception Type: AttributeError
    Exception Value:    Got AttributeError when attempting to get a value for field `grade` on serializer `DataSerializer`.
    The serializer field might be named incorrectly and not match any attribute or key on the `QuerySet` instance.
    Original exception text was: 'QuerySet' object has no attribute 'grade'.

标签: pythondjango

解决方案


像这样怎么样:

class GetGrade(generics.GenericAPIView):
    def get(self, request, *args, **kwargs):
        a_grade = Grade.objects.all()
        return Response(
            data=DataSerializer(a_grade, many=True).data,  # passed many=True as known argument
            status=status.HTTP_200
        )

发生错误是因为您通过Queryset传递DataSerializer。当你调用data方法时DataSerializer,它试图grade从 Queryset 中获取 value 属性。这就是为什么您需要传递many=True,以便序列化程序知道您正在传递查询集或对象列表。如果您希望序列化程序处理单个对象,那么您可以这样做:

class GetGrade(generics.GenericAPIView):
    def get(self, request, *args, **kwargs):
        a_grade = Grade.objects.all().first()  # it will return first object of queryset
        return Response(
            data=DataSerializer(a_grade).data, 
            status=status.HTTP_200
        )

最后,更简洁的方法是使用ListModelMixin。例如:

from rest_framework import mixins, generics

class GetGrade(mixins.ListModelMixin, generics.GenericAPIView):
    queryset = Grade.objects.all()
    serializer_class = DataSerializer

    # thats it, no more code needed

推荐阅读