Python 属性错误:';QuerySet';对象没有属性';类别';
我使用DRF从API获取和创建数据。我正在努力解决一个模型Python 属性错误:';QuerySet';对象没有属性';类别';,python,django,django-models,django-rest-framework,django-serializer,Python,Django,Django Models,Django Rest Framework,Django Serializer,我使用DRF从API获取和创建数据。我正在努力解决一个模型问题和一个属性类别,这也是一个模型。所以为了创建和读取数据,我必须实现这个方法。因此,每当我创建一个问题时,它的类别是一个整数,但当我阅读它时,它是一个对象 无论何时使用默认API路由,我都可以创建和读取数据,但无论何时编写不同的路由,我都会遇到以下错误: AttributeError:尝试获取序列化程序问题序列化程序上的字段类别的值时,获取了AttributeError。 序列化程序字段的名称可能不正确,并且与QuerySet实例上的任
问题
和一个属性类别
,这也是一个模型。所以为了创建和读取数据,我必须实现这个方法。因此,每当我创建一个问题时,它的类别是一个整数,但当我阅读它时,它是一个对象
无论何时使用默认API路由,我都可以创建和读取数据,但无论何时编写不同的路由,我都会遇到以下错误:
AttributeError:尝试获取序列化程序问题序列化程序
上的字段类别
的值时,获取了AttributeError。
序列化程序字段的名称可能不正确,并且与QuerySet
实例上的任何属性或键都不匹配。
原始异常文本为:“QuerySet”对象没有属性“category”
这是我的自定义代码,哪里出了问题…:
类用户问题(APIView):
权限\u类=[权限.已验证]
def get(自我、请求、*args、**kwargs):
questions=Question.objects.filter(创建者=request.user.id).all()
data=QuestionSerializer(问题)。数据
返回响应({
“问题”:数据
})
以防万一,这是我的答案的实现:
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__'
那么,我做错了什么呢?首先,您将多个项传递给序列化程序,因此您应该使用
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
仍然有效。非常感谢。