Как получить доступ к объекту пользователя в сериализаторе токенов Django Djoser - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть следующее в настройках:

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_complete и app_mode), но я не знаю, как получить к нему прямой доступ, чтобы передать его методу. Можно ли получить доступ к объекту user здесь?

1 Ответ

1 голос
/ 07 ноября 2019

Что вам нужно, это 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}'
...