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?
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.
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.
Und die Ausgabe ist:
%Vor%Hoffe das kann dir weiterhelfen, wenn dieser Ansatz sinnvoll ist und du ihn schreibbar machen willst ( Ссылка ).
Tags und Links python django serialization django-rest-framework