如何在python Django rest框架中的序列化程序中获取请求的其余部分?

2024-10-02 16:24:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个调查应用程序。我有一个模型AnsewerSet,它在一个Survey中保存所有问题的答案。这是我的models.py的一部分:

class AnswerSet(models.Model):
   survey = models.ForeignKey('Survey', models.CASCADE, related_name='answer_sets')

class Answer(models.Model):
   answer_set = models.ForeignKey(AnswerSet, models.CASCADE, related_name='answers')
   question = models.ForeignKey(Question, models.CASCASE, related_name='answers')

   text = models.TextField()

我想用以下json创建新的AnswerSet

{
  survey_id: 1,
  answers: [
    {
      text: 'I like that.'
    },
    {
      text: 'Don't do that!'
    }
  ]
}

这是一个有两个文本问题的Survey的答案

我想创建一个枯燥的序列化程序-我不想自己在.validate().create()方法中实现所有内容。到目前为止,我有这样的想法:

class AnswerSerializer(serializers.ModelSerializer):
   class Meta:
      model = Answer
      fields = ('id', 'text', 'answer_set', 'question')
      read_only_fields = ('id',)


class AnswerSetSerializer(serializers.ModelSerializer):
    answers = AnswerSerializer(many=True)

    class Meta:
        model = AnswerSet
        fields = ('id', 'survey', 'answers')
        read_only_fields = ('id',)

有很多问题。首先,每个答案都需要答案集和问题(答案集是明确定义的-我只是创建了一个,问题是通过调查和答案列表中的位置来定义的[问题是有序的])。 第二个问题是我正在使用ListSerializer(即many=True选项)进行创建,并且没有默认行为。但这可以通过创建自定义ListSerializer来解决,但对于这个最小的示例来说,这太复杂了

所以我想知道如何修改AnswerSetSerializer和AnswerSerializer,这样就不需要多次指定所有内容。现在,每个请求都需要如下所示:

{
  survey_id: 1,
  answers: [
    {
      text: 'I like that.'
      answer_set: ?, // not yet created
      question: 1 // first question of survey #1
    },
    {
      text: 'Don't do that!'
      answer_set: ?, // not yet created
      question: 2 // second question of survey #1
    }
  ]
}

Tags: 答案textansweridfieldsthatmodelssurvey