Как вернуть пользовательское, немодельное значение с помощью сериализатора в 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