【问题标题】:Serializer Error When Using Rest Framework to Serialize Nested Objects from Model使用 Rest Framework 序列化模型中的嵌套对象时出现序列化程序错误
【发布时间】:2019-05-06 06:24:04
【问题描述】:

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

我已经设置了一个视图来序列化具有嵌套模型的测试模型。我已经设置了序列化程序,但我收到错误“在序列化程序 TestSerializer 上尝试获取字段 Question 的值时出现属性错误。\n序列化程序字段可能命名不正确”。

我的序列化器:

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)

【问题讨论】:

  • 尝试为 question = QuestionSerializer() 使用不同的变量名称“question”
  • 新的变量名会不会也反映在fields和related_object中?

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


【解决方案1】:

您已经在外键中设置了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'

【讨论】:

  • 非常感谢,我使用 question_set 并将问题(序列化程序)替换为该问题以及字段中的问题。现在可以了,感谢您的帮助。
猜你喜欢
  • 2018-05-20
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 2019-01-29
  • 2018-07-04
  • 2015-06-18
相关资源
最近更新 更多