2016-10-20 4 views
3

ich eine Umfrage Art von App erschaffe, so habe ich drei Modelle Formular, questiosn, Choices [für Multiple-Choice-Fragen]Beispiel erwartet, bekam OrderedDict Django Ruhe Framework-beschreibbaren verschachtelte Serializer

Ich folgte diesem Tutorial http://www.django-rest-framework.org/api-guide/relations/#nested-relationships

es funktioniert für 1 Ebene verschachtelt Beziehungen in Ordnung, aber für 2 Ebenen gibt es

Typeerror: 'Choice' instance erwartet, bekam 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 

EDIT

Löste das manuelle Art und Weise verwendet wird, in FormSerializer die Methode erstellen außer Kraft setzen,

@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

Da ich nirgendwo mit dabei war, habe ich es manuell gemacht –

Antwort

2

Ich kämpfte auch mit diesem und ich glaube, die richtige Art und Weise zu handhaben ist:

Eine einfache Möglichkeit, dies zu vermasseln, besteht darin, keine Auswahlmöglichkeiten vor dem Erstellen des Frageobjekts aufzuheben. Wenn Sie das tun, erhalten Sie einen Fehler instance expected, got OrderedDict( 500.

Beachten Sie auch, dass Sie create() im QuestionSerializer nicht definieren müssen. Die gesamte Kindverarbeitung erfolgt auf oberster Ebene.

Verwandte Themen