在Django REST框架中,如何在使用ModeViewSet时允许部分更新?

时间:2018-01-25 19:58:05

标签: python django django-rest-framework

我想为可以部分更新的对象创建REST API。在http://www.django-rest-framework.org/api-guide/serializers/#partial-updates上给出了示例,其中在实例化序列化器时传递了partial=True

# Update `comment` with partial data
serializer = CommentSerializer(comment, data={'content': u'foo bar'}, partial=True)

但是,在我的情况下,模型(称为SessionType)具有以下视图集:

class SessionTypeViewSet(viewsets.ModelViewSet):
    queryset = SessionType.objects.all()
    serializer_class = SessionTypeSerializer

将序列化程序定义为

class SessionTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = SessionType
        fields = ('title',)

如何在此用例中调整序列化程序,以便partial始终为True

3 个答案:

答案 0 :(得分:6)

您无需以任何方式调整序列化程序。使用该视图集,使用PATCH方法对“详细信息”端点的任何调用都将进行部分更新。

Django Rest Framework ModelViewSet基类包括以下mixin。在这里,您可以看到partial=True在调用partial_update时如何传递,默认情况下路由到PATCH方法:

class UpdateModelMixin(object):
    """
    Update a model instance.
    """
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)

        if getattr(instance, '_prefetched_objects_cache', None):
            # If 'prefetch_related' has been applied to a queryset, we need to
            # refresh the instance from the database.
            instance = self.get_object()
            serializer = self.get_serializer(instance)

        return Response(serializer.data)

    def perform_update(self, serializer):
        serializer.save()

    def partial_update(self, request, *args, **kwargs):
        kwargs['partial'] = True
        return self.update(request, *args, **kwargs)

答案 1 :(得分:1)

部分更新隐含在ModelViewset documentation中,您需要做的唯一事情是使用PATCH方法调用“SessionTypeViewSet”端点

答案 2 :(得分:0)

“部分更新”是仅更新DB中的特定字段吗? 文档尚不清楚。 用PATCH方法检查,JSON请求中只有一个字段,但是在数据库中,所有列都已更新。