为什么HTTP方法的PATCH运行模型save()方法?

时间:2018-11-28 05:58:45

标签: django django-rest-framework patch

我在REST API中使用Django REST Framework的serializers.ModelSerializerviewsets.ModelViewSet

在测试时,我发现PATCH的{​​{1}}正在运行模型HTTP method

我知道save()用于更新数据,为什么DRF使用PATCH而不是save()

2 个答案:

答案 0 :(得分:2)

因为更新仅应用于查询集而不是单个实例,并且该更新可能会更改客户端提供的更多字段,因此很难预测。

答案 1 :(得分:1)

基本上它在UpdateModelMixin内部发生here。代码是:

class UpdateModelMixin(object):
    ...
    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)  # <-- Partial Update
        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
            # forcibly invalidate the prefetch cache on the instance.
            instance._prefetched_objects_cache = {}

        return Response(serializer.data)

    def perform_update(self, serializer):
         serializer.save() # <-- here

然后UpdateModelMixinModelViewSet子类化。

基本上使用串行器的Partial更新功能。