【问题标题】:AttributeError: 'QuerySet' object has no attribute 'category'AttributeError:“QuerySet”对象没有“类别”属性
【发布时间】:2021-04-27 18:40:36
【问题描述】:

我正在使用 DRF 从 API 获取和创建数据。我正在努力使用模型Question 和属性category,这也是一个模型。所以为了创建和读取数据,我必须实现this question's answer 方法。因此,每当我创建一个问题时,它的类别是一个整数,但当我阅读它时,它是一个对象。

每当我使用默认 API 路由时,我都可以创建和读取数据,但每当我编写不同的路由时都会收到以下错误:

AttributeError:尝试在序列化程序 QuestionSerializer 上获取字段 category 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 QuerySet 实例上的任何属性或键都不匹配。 原始异常文本为:“QuerySet”对象没有“类别”属性。

这是我的自定义代码,有问题...:

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)
    ...

那么,我做错了什么?

【问题讨论】:

    标签: python django django-models django-rest-framework django-serializer


    【解决方案1】:

    首先,您将多个项目传递给序列化程序,因此您应该使用many=True。所以在你的情况下,它将是

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

    其次,您不需要 relatedFieldAlternative。您可以只使用嵌套的 serailizer。

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

    【讨论】:

    • 1.我的错,谢谢。 2. 如果我在创建问题时不必添加类别,它将适用。
    • 尽管如此,在将 data 更改为 data = QuestionSerializer(questions, many=True, context={'request': request}).data 后它可以工作。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 2016-11-20
    • 2019-07-10
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2022-12-10
    相关资源
    最近更新 更多