我真的被困了几个小时。
我有以下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。
答案 0 :(得分:1)
您仅将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字段(您并不总是应该将它们传递给序列化器)