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)
Da ich nirgendwo mit dabei war, habe ich es manuell gemacht –