2016-10-20 11 views
3

내가 응용 프로그램의 설문 조사 종류를 만드는 오전 OrderedDict 장고 나머지 프레임 워크 쓰기 중첩 된 시리얼을 가지고, 그래서 내가 양식, [객관식 질문] Questiosn, 선택예상 예,

내가이 튜토리얼을 따라 세 가지 모델이 http://www.django-rest-framework.org/api-guide/relations/#nested-relationships

그것은 1 개 수준의 중첩 관계에 대해 잘 작동하지만이 개 수준은

형식 오류를 제공합니다 : '선택'인스턴스가 예상 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 

편집

은, create 메소드를 오버라이드 (override) FormSerializer에서 수동 방법을 사용하여 해결

@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) 
+0

나는 이걸로 어디에도 가지 않을 것이므로, 나는 그것을 수동으로했다. –

답변

2

내가이 고생하고 내가이 처리하는 적절한 방법을 생각입니다 :

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()를 정의 할 필요가 없습니다. 모든 하위 처리는 최상위 레벨에서 수행됩니다.