Создание и возврат токена в сериализаторе

#python #django

#python #django

Вопрос:

В настоящее время возникают трудности с возвратом токена в моем представлении регистрации.

Как я могу это исправить, чтобы create от UserSerializer мог возвращать токен и имя пользователя?

View.py

 @permission_classes([AllowAny])
class UserCreate(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
  

Serializers.py

 class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'password')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        password = validated_data.pop('password')
        user = User(**validated_data)
        user.set_password(password)
        user.save()
        token, _ = Token.objects.get_or_create(user=user)
        return Response(
            {
                'username': validated_data['username'],
                'token': token.key,
            },
            status=HTTP_200_OK
        )
  

Ошибка

 AttributeError: Got AttributeError when attempting to get a value for field `username` on serializer `UserSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Response` instance.
Original exception text was: 'Response' object has no attribute 'username'.
[13/Nov/2020 20:26:44] "POST /account/register HTTP/1.1" 500 120116
  

Комментарии:

1. Сообщение об ошибке username отсутствует в данных.

2. Вот мой запрос: http post http://127.0.0.1:8000/account/register username='test37' password='password'

3. Вставьте print(validated_data) свой сериализатор и посмотрите, есть ли все необходимые поля.

4. { «имя пользователя»: «test40» }

Ответ №1:

В итоге я поместил его в сериализатор:

 class UserCreate(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        token, created = Token.objects.get_or_create(user=serializer.instance)
        return Response({'token': token.key, 'username': serializer.instance.username}, status=HTTP_201_CREATED)```