DRF-Erstellungsmethode im Viewset oder im Serializer

Aug 28 2020

Was ist der Unterschied zwischen dem Anpassen der Methode "create" im DRF-Ansichtsset oder dem Anpassen im Serializer? Ich verstehe, dass der Serializer dafür verantwortlich ist, die Daten zu deserialisieren, dh wie die Daten in der POST-Abfrage dargestellt werden. Ich kann jedoch auch Objekte in verwandten Feldern im Serializer erstellen.

#views.py
def create(self, request):
    pass

#serializer.py
def create(self, validated_data):
    return Model.objects.create(**validated_data)

Wann sollte ich Ansichten / Erstellen vs. Serializer / Erstellen anpassen?

Antworten

4 GabrielMuj Aug 28 2020 at 16:25

create Methode aus Viewset

Diese Methode behandelt die POSTAnforderungslogik in der Ansicht, die standardmäßig Folgendes ausführt:

  • Instanziieren Sie den Serializer mit den Daten, die in der Anforderung als Nutzdaten enthalten sind
  • führte die is_validMethode auf dem Serializer aus
  • Führen Sie die eigentliche Erstellung durch Aufrufen der .save()Methode auf dem Serializer durch
  • Gibt die Ansicht Responsemit serialisierten Daten und dem Status 201 zurück

Sie müssen die createMethode im Viewset nicht wirklich überschreiben. Wenn Sie sie aus der Ansicht selbst an den Serializer senden möchten, können Sie sie überschreiben, perform_createwas standardmäßig der Fall ist serializer.save(). Z.B. Wenn Sie den Benutzer von der Anfrage senden möchten, können Sie Folgendes tun:

    def perform_create(self, serializer):
        # here you will send `created_by` in the `validated_data` 
        serializer.save(created_by=self.request.user)

Hinweis: Hinter der Szene savewird die createMethode auf dem Serializer mit dem ausgeführtvalidated_data

create Methode vom Serializer

Diese Methode erstellt nur die eigentliche Modellinstanz mit validated_data. Sie können diese Methode überschreiben, wenn Sie verwandte Objekte wie die folgenden erstellen müssen:

   def create(self, validated_data):
        items_data = validated_data.pop('items')

        # similar to Parent.objects.create(**validated_data)
        parent = super().create(**validated_data)

        for item_data in items_data:
            Item.objects.create(parent=parent, **item_data)
        return parent

Hier senden Sie also eine Nutzlast mit Daten zum ParentObjekt, aber auch eine Liste itemsmit deren Darstellung. Jetzt erstellt die createMethode auch die Elemente und verknüpft sie mit der übergeordneten Instanz.

Um dies zusammenzufassen:

  • In Viewset verarbeitet die Methode create den Anforderungs-Antwort-Fluss
  • Im Serializer übernimmt die Methode create die Erstellung von Modellinstanzen unter Verwendung validierter Daten.