Unterdrücken Sie "Feld sollte eindeutig sein" Fehler in Django REST-Framework

8

Ich habe ein Modell wie

%Vor%

und ein Serializer

%Vor%

Und ich möchte JSON mit MyModel-Objekt erhalten, aber es kann sich um vorhandene Objekte handeln. Also, wenn ich serializer.is_valid() mit Daten über existierende Objekte benutze, gibt es einen Fehler:

%Vor%

Fehler:

%Vor%

Gibt es eine Möglichkeit, das Verhalten für neue und vorhandene Objekte zu trennen? Insbesondere möchte ich ein neues MyModel -Objekt erstellen, wenn es noch keine Datenbank ist, und das vorhandene MyModel -Objekt aktualisieren, wenn es vorhanden ist.

    
The Godfather 25.03.2015, 05:01
quelle

2 Antworten

2

Sie überlasten im Grunde einen einzelnen Einstiegspunkt Ihrer REST-API, indem Sie versuchen, neue Instanzen zu erstellen und vorhandene Instanzen mithilfe einer POST-Anforderung zu aktualisieren. Darüber hinaus scheint es, dass Sie versuchen, mehrere Instanzen gleichzeitig innerhalb einer einzelnen POST-Anfrage zu erstellen und zu aktualisieren.

Das Django REST Framework (DRF) erwartet von einer POST-Anfrage, dass nur neue Instanzen erstellt werden. Daher löst das Senden eines vorhandenen Instanzdatensatzes eine eindeutige Integritätsverletzung für das Feld uuid aus, da DRF versucht, diesen Datensatz als neue Instanz zu erstellen, da die vorhandene Instanz bereits über diesen UUID-Wert verfügt.

Eine Lösung, um Ihre REST API "RESTful" zu machen, wäre, die Erstellung und Aktualisierung von Datensätzen in POST- bzw. PUT-Anfragen zu trennen. Es ist unklar, ob Sie die generischen API-Ansichten von DRF verwenden , sondern Sie kann CreateAPIView verwenden, um neue Instanzen zu POST zu erstellen, und dann eine separate UpdateAPIView zu PUT und / oder PATCH vorhandenen Instanzen erstellen. Noch besser können Sie das Abrufen über GET für beide Endpunkte mit den generischen Sichten ListCreateAPIView und RetrieveUpdateAPIView zulassen.

Schließlich können Sie zur Verarbeitung von Massenanforderungen (dh Mehrfachinstanzen in einer einzelnen Anfrage) entweder die integrierten Ansichtsmethoden überschreiben oder ein Paket eines Drittanbieters wie django-rest-rahmen-bulk .

    
Fiver 26.03.2015, 13:42
quelle
2

Ich hatte eine Situation, in der ich eine tiefgreifende Erstellungsmethode mit zwei Hierarchieebenen über dem Endpunkt hatte, bei der es wichtig war, dass alle Modelle idempotent waren.

Ich überschreibe die Validierung im Serializer und erstellt sie manuell.

Es ist wichtig, dass Sie das Feld oben zur Klasse hinzufügen (andernfalls wird der Validator nicht ausgeführt)

%Vor%     
Chris Barry 23.07.2015 08:07
quelle