【问题标题】:Allow partial update in serializer_class in Django REST允许在 Django REST 中的 serializer_class 中进行部分更新
【发布时间】:2020-12-10 14:04:03
【问题描述】:

我在发出 PATCH 请求时尝试部分更新我的 ProfileSerializer。但是我无法做到这一点,因为默认情况下 Serializer 不允许进行部分更改。我正在使用 Django Rest 框架 UpdateModelMixin 来处理我的补丁请求。我可以在哪里设置partial=True

查看:

class ProfileViewPartialUpdate(GenericAPIView, UpdateModelMixin):
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer
    lookup_field = 'token'
    lookup_url_kwarg = 'pk'

    def patch(self, request, *args, **kwargs):
        return self.partial_update(request, *args, **kwargs)

序列化器:

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ('token', 'bio', 'name', 'email', 'sport', 'location', 'image')

【问题讨论】:

  • “不允许进行部分更改”是什么意思?你有任何错误吗?反应如何?此外,如果您正在发出 HTTP PATCH 请求,DRF 将自动设置partial=True
  • @ArakkalAbu 我的错误是 PATCH 404 Bad Request
  • 404 状态码表示您引用了数据库中不存在的实体
  • 抱歉 400 错误请求
  • @ArakkalAbu 还有什么问题吗?

标签: django django-rest-framework axios partial serialization


【解决方案1】:

查看:

from rest_framework import generics

class ProfileViewPartialUpdate(generics.RetrieveUpdateAPIView):
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer
    lookup_field = 'pk'

序列化器:

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ('token', 'bio', 'name', 'email', 'sport', 'location', 'image')

【讨论】:

    【解决方案2】:

    看看我的一个项目中的这个 sn-p 代码。您可以进行相应的修改。将此添加到 ProfileViewPartialUpdate 类而不是补丁。

    def partial_update(self, request, slug):
        user = self.request.user
        get_blog = Blog.objects.get(slug=slug)
    
        instance = self.get_object()
        serializer = BlogSerializer(instance, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(data=serializer.data, status=HTTP_201_CREATED)
        return Response(data="wrong parameters", status=HTTP_400_BAD_REQUEST)
    

    希望这可能会有所帮助

    【讨论】:

    • 问题是,您不必在正常情况中设置partial=True,即当您使用内置视图时as-是。 OP 还没有任何自定义
    • 是的,partial=True 不是必须的。答案已更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2017-04-27
    • 2020-04-12
    • 2020-09-29
    相关资源
    最近更新 更多