栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何将JSON数据PUT / POST到ListSerializer?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何将JSON数据PUT / POST到ListSerializer?

默认情况下,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)

与旧的批量插件相同,这具有删除所有对象的相同效果。

此代码均未经过测试。 如果它不起作用,请将其作为详细示例。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660799.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号