簡體   English   中英

如何在 Django Djoser 令牌序列化程序中訪問用戶 object

[英]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 object。

在偽代碼中:

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

    ...

但我不明白如何在這個序列化程序中訪問用戶 object。 我看到user object 在兩個字段( registration_completeapp_mode )中用作源,但我不知道如何直接訪問它以便將其傳遞給方法。 是否可以在這里訪問user object?

你需要的是一個SerializerMethodField

這是一個只讀字段。 它通過調用它所附加的序列化器 class 上的方法來獲取其值。

該方法采用序列化的object參數。 在您的情況下,它是djoser_settings.TOKEN_MODEL默認情況下是rest_framework.authtoken.models.Token )。

如果您查看此 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}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM