beste Möglichkeit, um zusätzliche Felder zu Django-Rest-Framework ModelViewSet beim Erstellen hinzuzufügen

8

Ich habe ein Buchmodell mit einem Fremdschlüssel für den Benutzer (den Eigentümer des Buches):

%Vor%

Ich habe ein ModelViewSet für Book erstellt, das die Bücher des angemeldeten Benutzers anzeigt:

%Vor%

Um nun ein neues Buch zu erstellen, möchte ich das Benutzerfeld mit request.user speichern, nicht mit Daten, die vom Rest-Client gesendet werden (für mehr Sicherheit). zum Beispiel:

%Vor%

aber ich habe diesen Fehler: Diese QueryDict-Instanz ist unveränderbar. (bedeutet request.DATA ist ein unveränderliches QueryDict und kann nicht geändert werden)

Kennen Sie eine bessere Möglichkeit, zusätzliche Felder hinzuzufügen, wenn Sie ein Objekt mit dem django rest framework erstellen?

    
Ali 02.09.2013, 10:36
quelle

3 Antworten

10

Aktualisieren : Seit v3 müssen Sie dies tun:

%Vor%

Das Prinzip bleibt gleich.

Sie möchten das owner -Feld Ihres Buch-Serialisators schreibgeschützt machen und dann die Verknüpfung mit dem Benutzer in pre_save() festlegen.

Etwas wie:

%Vor%

Siehe den Tutorial-Abschnitt "Snippets zuordnen mit Benutzern ".

Ich hoffe, das hilft.

    
Carlton Gibson 02.09.2013, 10:54
quelle
6

Was es wert ist, hat sich in Django REST Framework 3 geändert. Es gibt jetzt einen perform_create() , der die älteren pre_save() und post_save() Haken ersetzt, die in einer vorherigen Antwort vorgeschlagen wurden. Zum Beispiel:

%Vor%

Hoffe, das spart jemandem Zeit.

    
Paul J 18.02.2015 23:37
quelle
1

Wenn Sie ModelSerializer verwenden, ist es so einfach wie die Methode restore_object() zu implementieren:

%Vor%

restore_object() wird verwendet, um ein Verzeichnis von Attributen in eine Objektinstanz zu deserialisieren. ModelSerializer implementiert diese Methode und erstellt / aktualisiert die Instanz für das Modell, das Sie in der Klasse Meta angegeben haben. Wenn die angegebene instance None ist, bedeutet dies, dass das Objekt noch erstellt werden muss. In diesem Fall setzen Sie einfach das Feld user mit dem gewünschten Wert.

Weitere Informationen: Ссылка

    
rednaw 28.04.2014 10:03
quelle