Добавление расширенных полей класса пользователя к данным полезной нагрузки в маркере доступа
Я расширил свой класс пользователя, чтобы включить другие поля (город, страна, биография). Я хотел бы передать их вниз, чтобы настроить мой JWT access_token на включение этих полей в качестве полезной нагрузки в дополнение к username.
Вот что у меня есть в моем models.py (расширяющем мой класс пользователя):
from django.db import models
from django.contrib.auth.models import User
#extending user model to include
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
city = models.CharField(max_length=50,blank=True)
country = models.CharField(max_length=50, blank=True)
bio = models.CharField(max_length=500, blank=True)
def __str__(self):
return self.user.username
serializers.py:
#changed from serializers.HyperLinked to ModelSerializer
class RegisterSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
#removed url from fields
fields = ['username', 'email', 'password', 'first_name', 'last_name', 'city', 'country', 'bio']
extra_kwargs = {
'password': {'write_only': True},
}
def create(self,validated_data):
user = Profile.objects.create_user(
username=validated_data['username'],
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
city=validated_data['city'],
country=validated_data['country'],
bio=validated_data['bio'],
email=validated_data['email'])
user.set_password(validated_data['password'])
user.save()
return user
#customizing the payload we get from our access tokens
class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
token['username'] = user.username
token['first_name'] = user.first_name
token['last_name'] = user.last_name
token['country'] = user.profile.country
token['city'] = user.profile.city
token['bio'] = user.profile.bio
return token
и api.py
#Register API
class RegisterApi(generics.GenericAPIView):
serializer_class = RegisterSerializer
#remove this if it doesn't work
authentication_classes = (TokenAuthentication,)
permission_classes = (AllowAny,)
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
return Response({
"user": UserSerializer(user, context=self.get_serializer_context()).data,
"message": "User Created Successfully. Now perform Login to get your token",
})
При попытке войти в систему сейчас я получаю сообщение об ошибке:
AttributeError at /api/token/
'User' object has no attribute 'profile'
Request Method: POST
Request URL: http://127.0.0.1:8000/api/token/