【发布时间】: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