Ich habe folgendes in den Einstellungen:
DJOSER = {
'SERIALIZERS': {
'token': 'api.api.MyTokenSerializer'
}
}
Und hier ist der Serializer, der für die Anmeldung verwendet wird:
class MyTokenSerializer(TokenSerializer):
auth_token = serializers.CharField(source="key")
registration_complete = serializers.BooleanField(source="user.registration_complete", read_only=True)
app_mode = serializers.CharField(source="user.app_mode", read_only=True)
class Meta:
model = djoser_settings.TOKEN_MODEL
fields = ("auth_token", "profile_complete", "app_mode")
und jetzt muss ich noch ein Feld hinzufügen, aber dieses Feld ist ein Methodenfeld und es braucht das user
Objekt.
Im Pseudocode:
class MyTokenSerializer(TokenSerializer):
...
new_field = my_method(user_object)
...
Ich verstehe jedoch nicht, wie ich auf das Benutzerobjekt in diesem Serializer zugreifen soll. Ich sehe, dass das user
Objekt in zwei Feldern ( registration_complete
und app_mode
) als Quelle verwendet wird, aber ich weiß nicht, wie ich direkt darauf zugreifen soll, um es an die Methode zu übergeben. Kann user
hier auf das Objekt zugegriffen werden?
Was Sie brauchen ist ein SerializerMethodField
:
Dies ist ein schreibgeschütztes Feld. Es erhält seinen Wert durch Aufrufen einer Methode für die Serializer-Klasse, an die es angehängt ist.
Diese Methode nimmt den Parameter des zu serialisierenden Objekts auf. In Ihrem Fall ist es ein djoser_settings.TOKEN_MODEL
( was standardmäßig istrest_framework.authtoken.models.Token
).
Wenn Sie sich die Implementierung dieses Modells ansehen , werden Sie feststellen, dass ein Fremdschlüssel auf den Benutzer verweist. Das ist der Grund, warum Sie Dinge tun können wie source=user.registration_complete
( source
ist eigentlich eine praktische Verknüpfung zum Serialisieren von Feldern in Fremdobjekten).
Sie können also so etwas tun:
class MyTokenSerializer(TokenSerializer):
new_field = serializers.SerializerMethodField()
def get_new_field(self, obj):
# "obj" is a Token object
user = obj.user
# Return the value you want
return f'Hello {user.email}'
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen