编写api调用以创建用户Django REST

时间:2019-02-17 16:14:25

标签: django django-rest-framework

我真的被困了几个小时。

我有以下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"

对于其他型号,我没有这些问题。有人可以告诉我为什么这不起作用吗?

编辑:正如Shakil所写,问题确实出在指定的字段上,但是即使声明了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 :(得分:1)

您仅将passworduser_name传递给序列化程序,但是您还包括了其他字段,例如iddeliveries

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字段,而且我假设iddeliveries是您的read_only字段(您并不总是应该将它们传递给序列化器)