Django REST Framework: SlugRelatedField für indirekt verwandte Attribute?

9

Ich habe ein Profilmodell, das eine Eins-zu-Eins-Beziehung mit Djangos Benutzermodell hat, und ich habe ein anderes Modell namens Permission (unabhängig von Djangos interner Idee von Berechtigungen), das einen Fremdschlüssel für Profile hat. So: (Ich habe die meisten Felder aus Gründen der Einfachheit hier entfernt)

%Vor%

Ich möchte einen Serializer für Permission erstellen, der Objekte wie folgt erstellt:

%Vor%

wo der Wert von "account" der Primärschlüssel des Kontos ist (das ist einfach, ich kann ein PrimaryKeyRelatedField verwenden) und der Wert von "user" ist die E-Mail-Adresse des Benutzers (das ist der Teil, den ich noch nicht herausgefunden habe , da die E-Mail-Adresse nicht direkt auf dem Profile-Objekt gespeichert ist, sondern auf dem zugehörigen DjangoUser-Objekt). Beachten Sie auch, dass dies NICHT schreibgeschützt ist - beim Erstellen einer Berechtigung muss es möglich sein, von einer E-Mail-Adresse zu einem Profilobjekt zu deserialisieren.

Einige Dinge, die ich bisher versucht habe, um den Benutzer auf dem Permission Serializer darzustellen ...

1.

%Vor%

Wenn ich eine E-Mail-Adresse (oder einen Primärschlüssel oder irgendetwas anderes) als "Benutzer" POST sende, wird ein 400-Fehler mit {"user": "This field is required."} zurückgegeben, als ob ich das Feld überhaupt nicht eingefügt hätte.

2.

%Vor%

Mit diesem bekomme ich AttributeError: 'Profile' object has no attribute 'django_user.email' . Das Gleiche passiert, wenn ich 'django_user__email' verwende.

Irgendwelche Ideen?

    
Avril 02.10.2014, 18:41
quelle

3 Antworten

2

Laut Django REST Framework-Serialisierungsreferenz ( Ссылка ):

  

Der Name des Attributs, mit dem das Feld gefüllt wird. Dies kann eine Methode sein, die nur ein self -Argument verwendet, z. B. URLField (source = 'get_absolute_url'), oder die Punktnotation zum Durchlaufen von Attributen verwenden, z. B. EmailField (source = 'user.email').

Wenn also source='user.email' nicht funktioniert, können Sie versuchen, eine Methode (z. B. get_user_email ) zu erstellen, sie in source verwenden und die Benutzer-E-Mail manuell zurückgeben.

    
Danilo Freitas 05.01.2016 21:19
quelle
0

Können Sie versuchen: user = serializers.SlugRelatedField(slug_field='django_user__email') ? Manchmal kann in Django die doppelte Unterstrichnotation für Abfragen nützlich sein. Quelle: Ссылка

    
Klahnen 29.10.2015 21:30
quelle
0

Ich habe mir die Zeit genommen, etwas Code zu schreiben, um Ihre Frage besser zu verstehen. Wenn Sie CRUD-Operationen auf Ihrem PermissionsSerializer vollständig unterstützen möchten, müssen Sie das Profile -Objekt verschachteln, damit Sie dessen Attribute lesen können. Dies sind die Serialisierer, die ich vorschlagen zu implementieren.

%Vor%

Und die Ausgabe ist:

%Vor%

Hoffe das kann dir weiterhelfen, wenn dieser Ansatz sinnvoll ist und du ihn schreibbar machen willst ( Ссылка ).

    
Klahnen 08.11.2015 02:12
quelle