【问题标题】:How to access user object in Django Djoser token serializer如何在 Django Djoser 令牌序列化程序中访问用户对象
【发布时间】:2020-03-04 04:54:45
【问题描述】:

我在设置中有以下内容:

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 对象?

【问题讨论】:

    标签: django django-rest-framework djoser


    【解决方案1】:

    你需要的是SerializerMethodField:

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

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

    如果您查看implementation of this model,您会看到有一个指向用户的外键。这就是为什么您可以执行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}'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-27
      • 2019-04-27
      • 2020-08-09
      • 2012-04-12
      • 2020-07-23
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多