我有嵌套的序列化程序,并希望通过覆盖create方法为其创建一个实例。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我有嵌套的序列化程序,并希望通过覆盖create方法为其创建一个实例。相关的知识,希望对你有一定的参考价值。

我的测验应用程序有两个模型如下: -

class Answer_Options(models.Model):
    text = models.CharField(max_length=200)

class Quiz_Question(models.Model):
    quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE, blank=True, default=None, null=True, related_name='questions')
    q_type = models.CharField(max_length=50)
    text = models.CharField(max_length=200)
    possible_answers = models.ManyToManyField(Answer_Options)
    selected = models.ForeignKey(Answer_Options, related_name="selected", default=None, on_delete=models.CASCADE, blank=True, null=True)
    correct = models.ForeignKey(Answer_Options, related_name="correct", default=None, on_delete=models.CASCADE, blank=True, null=True)
    order = models.IntegerField(blank=True, null=True)

现在我想为以上这些模型制作序列化器,如下所示: -

class Answer_OptionsSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Answer_Options
        fields = ('url', 'text')

对于像这样的Quiz_Question: -

class Quiz_QuestionSerializer(serializers.HyperlinkedModelSerializer):
    possible_answers = Answer_OptionsSerializer(many=True)
    correct = Answer_OptionsSerializer()
    class Meta:
        model = Quiz_Question
        fields = ('url', 'quiz', 'q_type', 'text', 'possible_answers', 'selected', 'correct')

现在我面临的问题是如何覆盖create()方法,以便我可以保存possible_answers为该问题,并保存selected以及correct选项,其中selectedcorrect选项必须是possible_answers列表中的值。例如,如果我的possible_answers列表是['A','B','C','D']那么selected以及correct字段的值必须是'A', 'B', 'C' or 'D'。提前致谢。

答案

我已经找到了这样做的方法: -

def create(self, validated_data):
        possible_answers_data = validated_data.pop('possible_answers')
        selected_answers_data = validated_data.pop('selected')
        correct_answers_data = validated_data.pop('correct')
        quiz_question = Quiz_Question.objects.create(**validated_data)
        if possible_answers_data:
            for answer in possible_answers_data:
                answer, created  = Answer_Options.objects.get_or_create(text=answer['text'])     
                if (answer.text == correct_answers_data['text']):
                    print answer.text
                    quiz_question.correct = answer                               
                quiz_question.possible_answers.add(answer)
        return quiz_question

以上是关于我有嵌套的序列化程序,并希望通过覆盖create方法为其创建一个实例。的主要内容,如果未能解决你的问题,请参考以下文章

覆盖继承的默认支持对象(如 dict、list)的嵌套 JSON 编码

Django Rest Framework 中的嵌套序列化程序“通过模型”

Django:相互嵌套序列化程序

django rest 框架模型序列化器 - 读取嵌套,写入平面

SCSS 扩展嵌套选择器并覆盖嵌套规则集

Django Rest Framework,如何更新序列化程序中的嵌套值