python - Django Rest 框架:用户更新
问题描述
我知道这已经讨论过了,而且很基本,但我找不到它有什么问题。我已经提取了我的旧项目(有效!)并与我所做的相对应。它永远不会在序列化程序中更新,我不知道为什么。我不知道我还缺少什么。
错误:
{"last_name":["此字段不得为空。"],"pass... null."],"email":["此字段不得为空"]},状态:400
前端patch('api/getprofile')
django/DRF序列化器:
class UserSerializer(serializers.ModelSerializer):
first_name = serializers.CharField()
last_name = serializers.CharField()
email = serializers.EmailField()
password = serializers.CharField(style={'input_type': 'password'})
class Meta:
model = User
fields = '__all__'
def create(self, validated_data):
user = User.objects.create(
username=validated_data.get('username'),
email=validated_data.get('email'),
password=validated_data.get('password')
)
user.set_password(validated_data.get('password'))
user.save()
return user
def update(self, instance, validated_data):
#print instance <-- if never gets here... is update not update
for key, value in validated_data.items():
if value:
print value
setattr(instance, key, value)
instance.save()
return instance
视图.py
class UserRetrieveUpdateAPIView(generics.RetrieveUpdateAPIView):
serializer_class = UserSerializer
permission_classes = (IsAuthenticated, )
queryset = User.objects.all()
def get_object(self):
return self.request.user
def update(self, request, *args, **kwargs):
serializer = UserSerializer(data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
instance = serializer.instance
return Response(UserSerializer(instance=instance).data, status=status.HTTP_200_OK)
解决方案
您可能需要为您提供的唯一实现APIView
是get_object
方法。
从源代码mixins.UpdateMixins
,update
(用于 HTTP PUT 请求)并partial_update
按照您的方式实现。
您提供的覆盖mixins.UpdateMixins.update
允许对请求进行部分更新,HTTP PUT
并且错过将模型实例传递给序列化程序以进行更新。IE
serializer = UserSerializer(self.get_object(), data=request.data, partial=True)
但是,我建议不要mixins.UpdateMixins.update
以当前方式执行覆盖。
使用实现的 HTTP 请求的标准处理,mixins.UpdateMixins
并且只为.get_object()
.
你已经用UserRetrieveUpdateAPIView.get_object()
.
推荐阅读
- javascript - 在 JavaScript 中将字符串转换为日期以允许比较
- python - error_bad_lines 参数已被弃用,并将在未来版本中删除。(蟒蛇熊猫)
- python - 如何检查列表中的所有单词是否都是python中的大写字母
- windows - 更改文件夹时应用程序图标变为空白
- laravel - 如何在 laravel 上的同一控制器中的其他 url 中的其他函数之间共享 $request 变量
- python - 使用python替换被网络占用的驱动器号,在资源管理器中得到错误的图标
- google-apps-script - 如何在谷歌表格脚本编辑器中引用一列数据进行输入?
- sql - 根据子查询结果从表中删除
- python - 获取破折号中的输入更新
- database - 使用 GORM 查询选择列