gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:26:27 27 4
gpt4 key购买 nike

我正在阅读有关自定义多个更新的内容 here 而且我还没有弄清楚在什么情况下调用自定义 ListSerializer 更新方法。我想一次更新多个对象,我现在不担心多次创建或删除。

来自文档中的示例:

# serializers.py
class BookListSerializer(serializers.ListSerializer):
def update(self, instance, validated_data):
# custom update logic
...

class BookSerializer(serializers.Serializer):
...
class Meta:
list_serializer_class = BookListSerializer

还有我的 View 集

# api.py
class BookViewSet(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer

我的网址设置使用 DefaultRouter

# urls.py
router = routers.DefaultRouter()
router.register(r'Book', BookViewSet)

urlpatterns = patterns('',
url(r'^api/', include(router.urls)),
...

所以我使用 DefaultRouter 进行了设置,以便 /api/Book/ 将使用 BookSerializer

一般的想法是,如果我将 JSON 对象数组 POST/PUT/PATCH 到 /api/Book/,那么序列化程序应该切换到 BookListSerializer

我已尝试将 POST/PUT/PATCH JSON 数据列表添加到此 /api/Book/ 中,如下所示:

[ {id:1,title:thing1}, {id:2, title:thing2} ]

但它似乎仍然使用 BookSerializer 而不是 BookListSerializer 来处理数据。如果我通过 POST 提交,我会得到 Invalid data。需要一本字典,但得到了列表。如果我通过 PATCH 或 PUT 提交,则会收到 Method 'PATCH' not allowed 错误。

问题:我是否必须调整 DefaultRouterBookViewSetallowed_methods 以允许列表的 POST/PATCH/PUT?通用 View 是否未设置为与 ListSerializer 一起使用?

我知道我可以为此编写自己的列表反序列化器,但我正在努力了解 DRF 3 中的新功能,看起来这应该可以工作,但我只是缺少一些约定或一些选项.

最佳答案

默认情况下,Django REST 框架假定您不处理批量数据的创建、更新或删除。这是因为 99% 的人没有处理批量数据创建,而 DRF leaves the other 1% to third-party libraries .

在 Django REST framework 2.x 和 3.x 中,第三方包 exists for this .

现在,您正在尝试进行批量创建,但您收到一个错误提示

Invalid data. Expected a dictionary, but got list

这是因为您发送的是要创建的对象列表,而不是只发送一个。您可以通过几种方法解决此问题,但最简单的方法是 override get_serializer on your viewadd the many=True flag当它是一个列表时发送给序列化程序。

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。现在,对于更新和删除等其他操作,您将需要覆盖默认路由。我假设您使用的是 routes provided by Django REST framework bulk , 但你可以随意使用任何你想要的方法名。

您还需要将批量 PUTPATCH 方法添加到 View 中。

from rest_framework.response import Response

def 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 框架不支持批量更新。这意味着您还 have to implement your own bulk updates .当前代码将处理批量更新,就像您尝试更新整个列表一样,这就是旧的批量更新包以前的工作方式。

虽然您没有要求批量删除,但这并不是特别困难。

def bulk_delete(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
self.perform_delete(queryset)
return Response(status=204)

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

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

关于python - 如何将 JSON 数据 PUT/POST 到 ListSerializer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27869841/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com