6

我正在创建一种调查类应用程序,所以我有三个模型 Form、Questiosn、Choices [用于多项选择题]

我按照本教程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

5

我也为此苦苦挣扎,我相信处理这个问题的正确方法是:

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']


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:
            choices_data = question_data.pop('choices')
            Question.objects.create(form=form, **question_data)
            for choice_data in choices_data:
                choice = Choice.objects.create(question=question, **choice_data)
        return form

解决这个问题的一个简单方法是在创建 Question 对象之前不要弹出选项。当你这样做时,你会得到一个instance expected, got OrderedDict(500 错误。

另请注意,您不需要在 QuestionSerializer 上定义 create()。所有子处理都在顶层完成。

于 2016-11-28T21:41:00.660 回答