Написание API-вызова для создания пользователя Django REST - PullRequest
0 голосов
/ 17 февраля 2019

Я действительно застрял на несколько часов.

У меня есть следующий UserSerializer: UserModel = get_user_model ()

class UserSerializer(serializers.ModelSerializer):

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


    class Meta:
        model = UserModel
        fields = ('id', 'username', 'deliveries', 'password')

И это, на мой взгляд:

class UserList(APIView):

    def post(self, request, format=None):
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, 
            status=status.HTTP_201_CREATED)
        return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)

Я использую стандартную модель пользователя Django.Но я не могу отправить запрос http.создать пользователя.Я всегда получаю "400_BAD_REQ"

Мой запрос в httpie выглядит следующим образом:

http -v POST http://127.0.0.1:8000/user/user-list/ username="Rudy" password="12345"

С другими моделями у меня нет этих проблем.Может кто-нибудь сказать мне, почему это не работает?

РЕДАКТИРОВАТЬ: Как писал Шакил, проблема действительно была с указанными полями, но даже при объявлении полей read_only это не работает, как ожидалось.

Не работает

class UserSerializer(serializers.ModelSerializer):

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

class Meta:
    model = UserModel
    fields = ('id', 'deliveries', 'username', 'password')
    read_only = ('id', 'deliveries',)
    write_only = ('password',)

Это работает:

class RegistrationSerializer(serializers.ModelSerializer):

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

class Meta:
    model = UserModel
    fields = ('username', 'password',)

Поставки - это PrimaryKeyRelatedField.

1 Ответ

0 голосов
/ 17 февраля 2019

Вы только передаете password и user_name в сериализатор, но также включаете другие поля, такие как id и deliveries.

class Meta:
    model = UserModel
    fields = ('id', 'username', 'deliveries', 'password')

что бы вы ни указали в поле, вы должны будете пропустить их, иначе ModelSerializer повысит validationError.

class Meta:
    model = UserModel
    fields = ('id', 'username', 'deliveries', 'password')
    read_only_fields = ('id', 'deliveries')
    write_only_fields = ('password')

, поскольку password всегда является полем write_only, а также я предполагаю, что id и deliveries - ваше поле read_only (вы не всегда предполагаете передавать их в сериализатор)

...