2015-01-12 1 views
8

In 2.x hatten wir einen Serializer, die aussah:Kanonische Methode, um in django-rest-framework 3.x Massen zu erstellen?

class FooSerializer(serializers.ModelSerializer): 
    bar = serializers.PrimaryKeyRelatedField() 

    class Meta: 
     model = Foo 

Diese Masse zu handhaben effektiv in der Lage war erzeugt (ein list als der Körper einer JSON Post-Anforderung vorbei). In 3.x ist dieser Endpunkt unterbrochen. Ich habe versucht, etwas similar to the docs on DRF

class FooListSerializer(serializers.ListSerializer): 
    def create(self, validated_data): 
     foos = [Foo(**item) for item in validated_data] 
     return Foo.objects.bulk_create(foos) 

class FooSerializer(serializers.ModelSerializer): 
    bar = serializers.PrimaryKeyRelatedField(
     queryset=Bar.objects.all() 
     ) 

    class Meta: 
     model = Foo 
     list_serializer_class = FooListSerializer 

umzusetzen Und während dies für eine einzelne erstellen Anfrage funktioniert, wenn ich versuche, eine Liste, die ich den Fehler passieren:

AttributeError: 'FooListSerializer' object has no attribute 'object' 

ich einige Hacks gesehen habe wo __init__ ist Super'd, aber es scheint mit der Schaffung der ListSerializer Klasse in 3.x muss es eine sauberere Möglichkeit, dies zu tun. Danke im Voraus.

+0

Mögliche Duplikat von [Wie schreiben/put json Daten ListSerializer] (http://stackoverflow.com/a/27871396/359284). Dort finden Sie meine ausführliche Antwort mit Beispielen für die Handhabung von Massenerstellung/-aktualisierung/-löschung. –

+0

Eigentlich wollte ich gerade Ihre Frage kommentieren - Ihre Lösung hat für mich funktioniert (danke eine Tonne), und ich glaube, dass diese verwandt sind, aber ich vermute, dass die "kanonische" Lösung noch nicht implementiert wurde? –

+0

Ich sollte erwähnen, dass Ihr bisheriger Weg seit 2.4 unterbrochen wurde, als DRF die Fähigkeit für eine Liste löschte, automatisch als "viele = Wahr" interpretiert zu werden. –

Antwort

0

Sie zeigen nicht, wie Ihr Code eine FooSerializer Instanz erstellt. Die Django REST Framework 3 documentation sagt:

When a serializer is instantiated and many=True is passed, a ListSerializer instance will be created. The serializer class then becomes a child of the parent ListSerializer .

So scheint es, dass Ihr Code erkennen soll, ob die Daten eine Instanz oder viele enthält, und:

  • serializer = FooSerializer() eine Instanz zu handhaben, oder
  • serializer = FooSerializer(many=True) zu handhaben eine Liste mit vielen Instanzen.

Explicit ist besser als implizite :-)

Verwandte Themen