如何访问Django Djoser令牌序列化程序中的用户对象



我有以下设置:

DJOSER = {
'SERIALIZERS': {
'token': 'api.api.MyTokenSerializer'
}
}

这是用于登录的序列化程序:

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")

现在我需要再添加一个字段,但那个字段是一个方法字段,它需要user对象。

在伪代码中:

class MyTokenSerializer(TokenSerializer):
...
new_field = my_method(user_object)
...

但是我不知道如何访问这个序列化程序中的用户对象。我看到user对象在两个字段(registration_completeapp_mode(中用作源,但我不知道如何直接访问它以便将它传递给方法。是否可以在此处访问user对象?

您需要的是SerializerMethodField:

这是一个只读字段。它通过调用它所附加的序列化程序类上的方法来获得它的值

此方法接受序列化对象的参数。在您的情况下,它是一个djoser_settings.TOKEN_MODEL(默认情况下为rest_framework.authtoken.models.Token(。

如果您查看这个模型的实现,您会发现有一个指向用户的外键。这就是为什么您可以执行source=user.registration_complete之类的操作(source实际上是序列化外部对象中字段的一种方便快捷方式(。

所以你可以这样做:

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}'

相关内容

最新更新