使用 Rest Framework 从模型序列化嵌套对象时出现序列化程序错误

Serializer Error When Using Rest Framework to Serialize Nested Objects from Model

我看过一些相关的帖子,但我不确定我需要做什么。

我已经设置了一个视图来序列化我的具有嵌套模型的测试模型。我已经设置了序列化程序,但出现错误 "Got AttributeError when attempting to get a value for field Question on serializer TestSerializer.\nThe serializer field might be named incorrectly".

我的序列化程序:

class AnswerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Answer
        fields = ('id', 'number', 'text', 'iscorrect')

class QuestionSerializer(serializers.ModelSerializer):
    answer = AnswerSerializer()

    class Meta:
        model = Question
        fields = ('id', 'number', 'text', 'answer')
        related_object = 'answer'

class TestSerializer(serializers.ModelSerializer):
    question = QuestionSerializer()

    class Meta:
        model = Test
        fields = ('id', 'name', 'question')
        related_object = 'question'

我的模特:

class Test(models.Model):
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    name = models.CharField(max_length=255,default='',blank=False)
    datecreated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

class Question(models.Model):
    test = models.ForeignKey(Test, on_delete=models.CASCADE)
    text = models.CharField(max_length=255,default='',blank=False)
    number = models.IntegerField()

    def __str__(self):
        return self.text

class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    text = models.CharField(max_length=255,default='',blank=False)
    number = models.IntegerField()
    iscorrect = models.BooleanField(default=False)

    def __str__(self):
        return self.text

来自视图的调用:

serializer = TestSerializer(test, many=True)

您已经在外键中设置了related_name,否则默认的相关名称是{model_name}_set。

class Question(models.Model):
  test = models.ForeignKey(Test, on_delete=models.CASCADE, related_name='questions')
  text = models.CharField(max_length=255,default='',blank=False)
  number = models.IntegerField()

  def __str__(self):
     return self.text

在序列化程序中,您可以访问该字段

class TestSerializer(serializers.ModelSerializer):
  questions = QuestionSerializer(many=True)

  class Meta:
    model = Test
    fields = ('id', 'name', 'question')
    related_object = 'question'