为什么 HTTP 方法的 PATCH 运行 模型 save() 方法?
Why does the PATCH of the HTTP method run the model save() method?
我在我的 REST API.
中使用 Django REST Framework 的 serializers.ModelSerializer
和 viewsets.ModelViewSet
我测试的时候发现HTTP method
的PATCH
是运行型号save()
。
我知道PATCH
是用来更新数据的,为什么DRF用save()
而不是update()
?
基本上它发生在 here,在 UpdateModelMixin
内。代码是:
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
并且 UpdateModelMixin
后来被 ModelViewSet
子类化。
基本上它使用 Serializer 的 Partial 更新功能。
因为更新适用于查询集而不是单个实例,并且更新可能会更改客户端提供的更多字段,这使得事情难以预测。
我在我的 REST API.
中使用 Django REST Framework 的serializers.ModelSerializer
和 viewsets.ModelViewSet
我测试的时候发现HTTP method
的PATCH
是运行型号save()
。
我知道PATCH
是用来更新数据的,为什么DRF用save()
而不是update()
?
基本上它发生在 here,在 UpdateModelMixin
内。代码是:
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
并且 UpdateModelMixin
后来被 ModelViewSet
子类化。
基本上它使用 Serializer 的 Partial 更新功能。
因为更新适用于查询集而不是单个实例,并且更新可能会更改客户端提供的更多字段,这使得事情难以预测。