默认情况下,Django
REST框架假定您不处理批量数据的创建,更新或删除。这是因为99%的人没有处理批量数据创建,而DRF将其余1%的资源留给了第三方库。
在Django REST框架2.x和3.x中,为此存在第三方软件包。
现在,您正在尝试进行批量创建,但返回的错误提示
无效数据。希望有字典,但有清单
这是因为您发送的是要创建的对象列表,而不只是发送一个。你可以解决这个问题的一些方法,但最简单的是只覆盖
get_serializer你的观点,以对添加
many=True标志到串行器时,它是一个列表。
def get_serializer(self, *args, **kwargs): if "data" in kwargs: data = kwargs["data"] if isinstance(data, list): kwargs["many"] = True return super(MyViewSet, self).get_serializer(*args, **kwargs)
这将使Django
REST框架知道
ListSerializer批量创建对象时自动使用。现在,对于其他 *** 作(如更新和删除),您将需要覆盖默认路由。我将假设您正在使用Django
REST框架bulk提供的路由,但是您可以自由使用所需的任何方法名称。
您将需要为批量
PUT和
PATCH视图添加方法。
from rest_framework.response import Responsedef bulk_update(self, request, *args, **kwargs): partial = kwargs.pop("partial", False) queryset = self.filter_queryset(self.get_queryset)) serializer = self.get_serializer(instance=queryset, data=request.data, many=True) serializer.is_valid(raise_exception=True) self.perform_update(serializer) return Response(serializer.data)def partial_bulk_update(self, *args, **kwargs): kargs["partial"] = True return super(MyView, self).bulk_update(*args, **kwargs)
默认情况下,这将无法立即使用,因为Django REST框架不支持批量更新。这意味着您还必须实现自己的批量更新。当前代码将像处理批量更新一样处理批量更新,这就是以前的旧批量更新程序包的工作方式。
尽管您不要求批量删除,但这并不是特别困难。
def bulk_delete(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) self.perform_delete(queryset) return Response(status=204)
与旧的批量插件相同,这具有删除所有对象的相同效果。
此代码均未经过测试。 如果它不起作用,请将其作为详细示例。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)