【问题标题】:Django rest framework add extra context in responseDjango rest 框架添加额外的上下文作为响应
【发布时间】:2018-11-09 15:22:24
【问题描述】:

我正在使用 updateapiview 来更新我的用户信息。这是我的看法

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

这是我的序列化器

class UserUpdateSerializer(serializers.ModelSerializer):

  email = serializers.EmailField(required=True)

  def validate_username(self, username):
    if User.objects.filter(username=username):
        raise serializers.ValidationError('Username already exists!!')
    return username

  def validate_email(self, email):
    if User.objects.filter(email=email):
        raise serializers.ValidationError('Email already exists!!')
    return email

  class Meta:
    model = User
    fields = ('pk', 'username', 'password', 'email')
    read_only_fields = ('pk',)

我正在更新数据并成功返回。但是我想在成功更新用户配置文件时添加一些字段,例如带有“成功更新”内容的消息。我搜索了是否有任何方法可以执行此操作,但找不到合适的方法(类似于 django 中的 get_context_data 方法)。那么,有什么办法可以完成上述任务吗??

问题 2: 如何防止自我用户(即如果有一个电子邮件 sample@gmail.com 并且如果用户使用同一电子邮件单击 udpate,它不应该引发用户名已经存在的错误,我想这可以通过 self.instance 完成(但是不知道如何实际实现它)。

谢谢!

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    我不确定您使用的是什么版本的 DRF,但在最新的 3.9.0 UpdateAPIView 中使用 UpdateModelMixin,其中 returns Response object 而不是实例。所以你可以在返回之前修改数据。

    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
    

    【讨论】:

    • 谢谢@UnholyRaven
    猜你喜欢
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多