2017-11-23 2 views
1

Ich habe einen Modell-Serializer, der zusammen mit einem anderen OutboundProgram-Objekt ein Program-Objekt erstellt. Der JSON, den ich erhalte, enthält alle Details eines Programmobjekts und die zusätzlichen, die ich brauche, um das OutboundProgram zu erstellen. Wie lade ich die zusätzlichen Felder ab, weil der Serializer nur die Felder für ein bestimmtes Objekt liest. P.S. unser Team unter der Leitung doesnt wollen, dass ich eine verschachtelte JSONSo rufen Sie zusätzliche JSON-Daten aus der Anforderung in django ModelSerializer ab

json durch die Anforderung empfangen verwenden:

{ 
"linkage": "AP", 
"name": "something", 
"academic_year": 2017, 
"terms_available":[1,2], 
"is_graduate": false, 
"requirement_deadline":"2011-10-16", 
"institution": 3 
} 

models.py

class Program(SoftDeletionModel): 
    linkage = ForeignKey(Linkage) 
    name = CharField(max_length=64) 
    academic_year = ForeignKey(AcademicYear) 
    terms_available = ManyToManyField(Term) 
    is_graduate = BooleanField() 

    def __str__(self): 
     return self.name 


class OutboundProgram(SoftDeletionModel): 
    program = ForeignKey(Program) 
    requirement_deadline = DateField() 
    institution = ForeignKey(Institution) 

serializers.py

class OutboundProgramSerializer(ModelSerializer): 
    class Meta: 
     model = Program 
     fields = "__all__" 

    def create(self, validated_data): 
     terms = validated_data.pop('terms_available') 
     program = Program.objects.create(**validated_data) 
     for term in terms: 
      program.terms_available.add(term) 
     program.save() 

     outbound_program = OutboundProgram.objects.create(program=program) 
     #how to assign outbound_program.requirements_deadline from json 
     return program 

Jede Art Hilfe wäre nützlich. Vielen Dank!

Antwort

0

versuchen extra-context zu verwenden:

request = self.context['request'] 
terms = request.data.get('terms_available', []) 
+0

das ist mein Problem dank gelöst! youre ein Lebensretter – Jason

+0

froh, Ihnen zu helfen! –

0

serializers.py

class OutboundProgramSerializer(ModelSerializer): 
    requirement_deadline = serializers.DateField(write_only=True) 
    institution = serializers.IntegerField(write_only=True) 
    class Meta: 
     model = Program 
     fields = "__all__" 

    def create(self, validated_data): 
     terms = validated_data.pop('terms_available') 
     program = Program.objects.create(**validated_data) 
     for term in terms: 
      program.terms_available.add(term) 
     program.save() 

     outbound_program = OutboundProgram.objects.create(program=program) 
     outbound_program.requirement_deadline = validated_data.pop('requirement_deadline') 
     outbound_program.institution_id = validated_data.pop('institution') 
     outbound_program.save() 
     return program 
+0

Ich glaube nicht, dass dies funktionieren wird. Valided_data enthält nicht die 2 zusätzlichen Felder, es wird nur einen Schlüsselfehler zurückgeben – Jason

Verwandte Themen