我正在使用updateapiview更新我的用户信息。这是我的观点
Iterable
这是我的序列化器
class UserUpdateView(generics.UpdateAPIView):
serializer_class = UserUpdateSerializer
def get_queryset(self):
print(self.kwargs['pk'])
return User.objects.filter(pk=self.kwargs['pk'])
def partial_update(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data, partial=True)
if self.get_object() != request.user:
return Response({'error': 'permission denied'}, status=status.HTTP_400_BAD_REQUEST)
print(request.data['password'])
request.data['password'] = make_password(request.data['password'])
instance = super(UserUpdateView, self).partial_update(request, *args, **kwargs)
return instance
我正在更新数据并成功返回。但是我想在成功更新用户配置文件时添加一些字段,例如消息,内容“成功更新”。我搜索了是否有任何方法可以执行此操作,但是找不到合适的方法(类似于Django中的get_context_data方法)。那么,有什么方法可以执行以上任务?
问题2: 如何防止自己的用户(即,如果有电子邮件sample@gmail.com,并且如果用户单击具有相同电子邮件的udpate,则不应引起用户名已存在的错误,我想这可以通过self.instance完成(但是不确定如何实际实施)。
谢谢!
答案 0 :(得分:0)
我不确定您使用的是哪个版本的DRF,但在最新的3.9.0 UpdateAPIView
中使用的是returns Response object,而不是实例的UpdateModelMixin
。因此,您可以在返回之前修改数据。
def partial_update(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data, partial=True)
if self.get_object() != request.user:
return Response({'error': 'permission denied'}, status=status.HTTP_400_BAD_REQUEST)
print(request.data['password'])
request.data['password'] = make_password(request.data['password'])
response = super(UserUpdateView, self).partial_update(request, *args, **kwargs)
response.data['message'] = 'Successfully updated'
return response
关于第二个问题,您可以使用self.instance
排除当前用户。
def validate_email(self, email):
if User.objects.filter(email=email).exclude(id=self.instance.id).exists():
raise serializers.ValidationError('Email already exists!!')
return email