attributeerror:'queryset'对象没有属性'category'

0s7z1bwu  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(370)

我使用drf从api获取和创建数据。我在和一个模特搏斗 Question 和一个属性 category 这也是一个模型。所以为了创建和读取数据,我必须实现这个问题的答案方法。因此,每当我创建一个问题,它的类别是一个整数,但当我读它,是一个对象。
每当我使用默认api路由时,我都可以创建和读取数据,但每当我编写不同的路由时,就会出现以下错误:
attributeerror:尝试获取字段的值时获取attributeerror category 在序列化程序上 QuestionSerializer . 序列化程序字段的名称可能不正确,并且与上的任何属性或键都不匹配 QuerySet 示例。原始异常文本为:“queryset”对象没有“category”属性。
这是我的自定义代码,哪里出错了…:

class UserQuestions(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request, *args,**kwargs):
        questions = Question.objects.filter(created_by=request.user.id).all()
        data = QuestionSerializer(questions).data

        return Response({
            'questions': data
        })

以防万一,这是我的答案:

class RelatedFieldAlternative(serializers.PrimaryKeyRelatedField):
    def __init__(self,**kwargs):
        self.serializer = kwargs.pop('serializer', None)
        if self.serializer is not None and not issubclass(self.serializer, serializers.Serializer):
            raise TypeError('"serializer" no es una clase serializer válida')

        super().__init__(**kwargs)

    def use_pk_only_optimization(self):
        return False if self.serializer else True

    def to_representation(self, instance):
        if self.serializer:
            return self.serializer(instance, context=self.context).data
        return super().to_representation(instance)

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

class QuestionSerializer(serializers.ModelSerializer):
    category = RelatedFieldAlternative(queryset=Category.objects.all(), serializer=CategorySerializer)
    answers = AnswerSerializer(many=True, source='answer_set', allow_null=True, required=False)
    created_by = UserSerializer(required=False)

    def to_representation(self, instance): response = super().to_representation(instance) response['category'] = CategorySerializer(instance.category).data return response

    class Meta:
        model = Question
        fields = '__all__'

这就是 Question 型号:

class Question(models.Model):
    id = models.AutoField(primary_key=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True)
    question = models.CharField(max_length=1000)
    ...

那么,我做错了什么?

rkttyhzu

rkttyhzu1#

首先,要将多个项传递给序列化程序,因此应该使用 many=True . 所以对你来说

data = QuestionSerializer(questions, many=True).data

第二,你不需要相关的选择。你可以使用嵌套的serailizer。

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

class QuestionSerializer(serializers.ModelSerializer):
     category = CategorySerializer()

      class Meta:
         model = Question
         fields = '__all__'

相关问题