我在REST API中使用Django REST Framework的serializers.ModelSerializer
和viewsets.ModelViewSet
。
在测试时,我发现PATCH
的{{1}}正在运行模型HTTP method
。
我知道save()
用于更新数据,为什么DRF使用PATCH
而不是save()
?
答案 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
然后UpdateModelMixin
被ModelViewSet
子类化。
基本上使用串行器的Partial更新功能。