如何通过提供嵌套的HyperlinkedModelSerializer字段的url来使用HyperlinkedModelSerializer创建实例?

时间:2018-05-29 02:55:57

标签: django django-rest-framework

我正在尝试创建一个模型实例,其所有字段都是相关字段。

class LearnerQuestionAnswer(models.Model):
    quiz_question = models.ForeignKey(Quiz_Question, on_delete=models.CASCADE)
    learner = models.ForeignKey(Learner_Model, on_delete=models.CASCADE)
    chosen_option = models.ForeignKey(Answer_Options, related_name="chosen_option", default=None, on_delete=models.CASCADE, blank=True, null=True)

对于这个模型,我创建了以下序列化器: -

class LearnerQuestionAnswerSerializer(serializers.HyperlinkedModelSerializer):
    quiz_question = Quiz_QuestionSerializer()
    learner = Learner_ModelSerializer()
    chosen_option = Answer_OptionsSerializer()
    class Meta:
        model = LearnerQuestionAnswer
        fields = ('quiz_question', 'learner', 'chosen_option')

所有嵌套的序列化程序都是HyperlinkedModelSerializer。

我想通过提供相关字段的URL来创建此模型的实例,例如考虑以下POST方法: -

{
    "quiz_question":  "http://localhost:8080/api/registration_quiz_questions/83/",
    "learner":  "http://localhost:8080/api/registration_learners/3/",
    "chosen_option": "http://localhost:8080/api/registration_answer_options/218/",
}

这可能是怎么回事?

1 个答案:

答案 0 :(得分:1)

默认情况下,

HyperlinkedModelSerializer用于相关字段HyperlinkedRelatedField,这可以为您提供所需的行为。要将数据表示为嵌套对象,您可以覆盖to_representation方法:

class LearnerQuestionAnswerSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = LearnerQuestionAnswer
        fields = ('quiz_question', 'learner', 'chosen_option')

    def to_representation(self, instance):
        self.fields['quiz_question'] = Quiz_QuestionSerializer()
        self.fields['learner'] = Learner_ModelSerializer()
        self.fields['chosen_option'] = Answer_OptionsSerializer()
        return super(LearnerQuestionAnswerSerializer, self).to_representation(instance)