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

How to access user object in Django Djoser token serializer

我在设置中有以下设置:

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:

This is a read-only field. It gets its value by calling a method on the serializer class it is attached to.

这个方法接受序列化对象的参数。在您的情况下,它是 djoser_settings.TOKEN_MODEL (which by default is rest_framework.authtoken.models.Token).

如果你看一下 implementation of this model, you'll see that there is a foreign key pointing to the user. That's why you can do things like 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}'