Django rest框架在响应中添加了额外的上下文

时间:2018-11-09 15:22:24

标签: django django-rest-framework

我正在使用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完成(但是不确定如何实际实施)。

谢谢!

1 个答案:

答案 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