Django REST framework как создать нового пользователя?

Я пытаюсь получить POST-запросы в моем Django-приложении, используя Django REST framework, но по какой-то причине мне всегда не удается получить запрос. Либо я получаю ошибку разрешения при создании представления на основе класса. Если я создаю представление на основе функции, я всегда сталкиваюсь с ошибкой валидации, и я немного расстроен сложностью DRF.

Посмотрите на следующее представление для создания объекта User:

views.py

@api_view(['GET', 'POST'])
@permission_classes([AllowAny])
def user_create(request):
    if request.method == 'POST':
        print(request.data)
        serializer = CreateUserProfileSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response({
            "user": UserSerializer(user, context=serializer.data)
        })

serializers.py

class CreateUserProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = get_user_model()
        fields = ('id', 'user',)
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        user = User.objects.create(
                validated_data['user'],
                validated_data['password'])
        user.save()
        return user

ошибка при отправке POST на конечную точку:

   File "/App/App_API/serializers.py", line 36, in create
     validated_data['password'])
 KeyError: 'password'

Почему так? Если я сделаю следующее в коде моих представлений:

 print(request.data)

На консоли я вижу следующее:

<QueryDict: {'user': ['peter432'], 'password': ['OUBIfwiowef']}>

Может кто-нибудь поделиться своим способом создания пользователя.

Правильным способом является использование User.objects.create_user.

См. этот ответ: https://stackoverflow.com/a/23482284/117831

2 ошибки:

  1. Пароля нет в fields, поэтому его нет в validated_data
  2. .
  3. Вы сохраняете хэшированный пароль, вам нужно сначала создать экземпляр пользователя на уровне python и хэшировать пароль, как:
password = validated_data.pop('password')
u1 = User(....)
u1.set_password(password)
u1.save()

Это работает для меня:

views.py

@api_view(['POST'])
@permission_classes([AllowAny])
def user_create(request):
    if request.method == 'POST':
        print(request.data)
        serializer = CreateUserSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return JsonResponse(serializer.data, safe=False)

serializers.py

class CreateUserSerializer(serializers.ModelSerializer):

    class Meta:
        model = get_user_model()
        fields = ('user', 'password')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        print(validated_data)
        password = validated_data.pop('password')
        print(password)
        user = User.objects.create_user(
                validated_data['user'],
        )
        user.set_password(password)
        user.save()
        return user

Если вы удалите строку:

extra_kwargs = {'password': {'write_only': True}}

Он также покажет вам хэшированный пароль пользователя. Спасибо всем за ваши хорошие идеи

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