AttributeError: 'QuerySet' object has no attribute 'category'
AttributeError: 'QuerySet' object has no attribute 'category'
我正在使用 DRF 从 API 获取和创建数据。我正在为模型 Question
和属性 category
而苦苦挣扎,这也是一个模型。所以为了创建和读取数据,我必须实现 方法。因此,每当我创建一个问题时,它的类别是一个整数,但当我读取它时,它是一个对象。
每当我使用默认 API 路由时,我都可以创建和读取数据,但每当我编写不同的路由时,我都会收到以下错误:
AttributeError: Got AttributeError when attempting to get a value for field category
on serializer QuestionSerializer
.
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 'category'.
这是我的自定义代码,哪里有问题...:[=21=]
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):
<b>category = RelatedFieldAlternative(queryset=Category.objects.all(), serializer=CategorySerializer)</b>
answers = AnswerSerializer(many=True, source='answer_set', allow_null=True, required=False)
created_by = UserSerializer(required=False)
<b>def to_representation(self, instance):
response = super().to_representation(instance)
response['category'] = CategorySerializer(instance.category).data
return response</b>
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)
...
那么,我做错了什么?
首先,您要将多个项目传递给序列化程序,因此您应该使用 many=True
。所以在你的情况下,它将是
data = QuestionSerializer(questions, many=True).data
其次,您不需要 relatedFieldAlternative。您可以只使用嵌套的串行器。
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = '__all__'
class QuestionSerializer(serializers.ModelSerializer):
category = CategorySerializer()
class Meta:
model = Question
fields = '__all__'
我正在使用 DRF 从 API 获取和创建数据。我正在为模型 Question
和属性 category
而苦苦挣扎,这也是一个模型。所以为了创建和读取数据,我必须实现
每当我使用默认 API 路由时,我都可以创建和读取数据,但每当我编写不同的路由时,我都会收到以下错误:
AttributeError: Got AttributeError when attempting to get a value for field
category
on serializerQuestionSerializer
. The serializer field might be named incorrectly and not match any attribute or key on theQuerySet
instance. Original exception text was: 'QuerySet' object has no attribute 'category'.
这是我的自定义代码,哪里有问题...:[=21=]
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):
<b>category = RelatedFieldAlternative(queryset=Category.objects.all(), serializer=CategorySerializer)</b>
answers = AnswerSerializer(many=True, source='answer_set', allow_null=True, required=False)
created_by = UserSerializer(required=False)
<b>def to_representation(self, instance):
response = super().to_representation(instance)
response['category'] = CategorySerializer(instance.category).data
return response</b>
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)
...
那么,我做错了什么?
首先,您要将多个项目传递给序列化程序,因此您应该使用 many=True
。所以在你的情况下,它将是
data = QuestionSerializer(questions, many=True).data
其次,您不需要 relatedFieldAlternative。您可以只使用嵌套的串行器。
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = '__all__'
class QuestionSerializer(serializers.ModelSerializer):
category = CategorySerializer()
class Meta:
model = Question
fields = '__all__'