Как вернуть пользовательское, немодельное значение с помощью сериализатора в Django?

Я хочу вернуть пользовательское значение из моего сериализатора. Я получаю токены аутентификации для пользователя и хотел бы вернуть их как часть процесса регистрации. На данный момент я возвращаю объект пользователя и не знаю, как добавить токены в возвращаемый объект, поскольку токены не являются частью моей модели User. Вот сериализатор:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        exclude = ['password', 'is_active', 'staff', 'admin', 'last_login']

    def create(self, validated_data):

        userName= validated_data['userName']
        id= validated_data['id']
        dateOfBirth = validated_data['dateOfBirth']
        gender = validated_data['gender']
        height = validated_data['height']
        weight = validated_data['weight']

        user = User(userName=userName, id=id, dateOfBirth=dateOfBirth, gender=gender, height=height, weight=weight)
        user.set_password("")
        user.save()

        try:
            jwt_token = get_tokens_for_user(user)
        except User.DoesNotExist:
            raise serializers.ValidationError(
                'User does not exists'
            )
 
        return user

userName, id, dateOfBirth, рост и вес являются полями в моей модели пользователя. Теперь я хочу вернуть также jwt_token из create -метода для использования в моем views.py, возможно ли добавить его к объекту пользователя без редактирования модели?

Вы можете вернуть кортеж, включающий user и jwt_token следующим образом:

return (user, jwt_token)

и что-то вроде этого в views.py:

instance, token = serializer.save()

Но если вы используете какие-либо предопределенные Veiwsets или Mixins будьте осторожны когда вы передаете им этот сериализатор.

Надеюсь, это помогло.

Вы можете попробовать что-то вроде этого:

try:
  jwt_token = get_tokens_for_user(user)
except User.DoesNotExist:
  raise serializers.ValidationError(
    'User does not exists'
  )

created_data = {
  'token_access': jwt_token, # note that jwt_token is dict
  'user': UserSerializer(user).data,
}
return created_data

Но, честно говоря, я рекомендую не смешивать логику пользователя и токена и перенести эту часть в раздел просмотра:

try:
   jwt_token = get_tokens_for_user(user)
except User.DoesNotExist:
   raise serializers.ValidationError(
     'User does not exists'
   )

Затем запишите токен и пользователя в Response

Вернуться на верх