6

私は調査のようなアプリを作成しているので、フォーム、質問、選択肢の3つのモデルがあります[複数選択質問の場合]

このチュートリアルに従いましたhttp://www.django-rest-framework.org/api-guide/relations/#nested-relationships

1 レベルのネストされたリレーションでは問題なく機能しますが、2 レベルでは

TypeError: 'Choice' インスタンスが必要で、OrderedDict([(u'title', u'option1')]) を取得しました

class ChoiceSerializer(serializers.ModelSerializer):

    class Meta:
        model = Choice
        fields = ['title']

class QuestionSerializer(serializers.ModelSerializer):
    choices = ChoiceSerializer(many=True, required=False)

    class Meta:
    model = Question
    fields = ['title', 'type', 'required','order','choices']

    def create(self, validated_data):
    choices_data = validated_data.pop("choices")
    question = Question.objects.create(**validated_data)
    for choice_data in choices_data:
        Choice.objects.create(question=question, **choice_data)
    return question

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

    class Meta:
    model = Form
    fields = ['title', 'description', 'created', 'active', 'hash','questions']
    read_only_fields = ['active','hash']

    def create(self, validated_data):
    questions_data = validated_data.pop('questions')
    form = Form.objects.create(**validated_data)
    for question_data in questions_data:
        Question.objects.create(form=form, **question_data)
    return form

編集

手動の方法で解決しましたが、FormSerializer で create メソッドをオーバーライドし、

@transaction.atomic
    def create(self, validated_data):
        try:
            with transaction.atomic():
                questions_data = validated_data.pop('questions')
                form = Form.objects.create(**validated_data)
                for question_data in questions_data:
                    question = Question.objects.create(form=form,
                                                       title=question_data['title'],
                                                       type=question_data['type'],
                                                       required=question_data['required'])
                    if question.type == Question.RADIO or question.type == Question.CHECKBOX:
                        choices_data = question_data.pop('choices')
                        for choice_data in choices_data:
                            choice = Choice.objects.create(question=question, title=choice_data['title'])
                return form
        except Exception, e:
            raise serializers.ValidationError("Cannot Save Form %s" % e)
4

1 に答える 1