我正在阅读有关自定义多个更新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
和我的视图集
# api.py
class BookViewSet(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
我的url设置使用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
,这是一个普遍的想法吗?
我试过将JSON数据列表POST/PUT/PATCH到这个/api/Book/
中,它看起来像:
[ {id:1,title:thing1}, {id:2, title:thing2} ]
但它似乎仍然使用BookSerializer
而不是BookListSerializer
来处理数据。如果我通过POST提交,我会得到Invalid data. Expected a dictionary, but got list
。如果我通过PATCH或PUT提交,那么会得到一个Method 'PATCH' not allowed
错误。
问题:
我是否必须调整allowed_methods
的DefaultRouter
或BookViewSet
以允许列表的POST/PATCH/PUT?泛型视图是否未设置为使用ListSerializer
?
我知道我可以为此编写自己的列表反序列化程序,但我正在尝试更新DRF 3中的新功能,看起来这应该可以工作,但我只是缺少一些约定或一些选项。
默认情况下,Django REST framework假定您没有处理批量数据的创建、更新或删除。这是因为99%的人不处理批量数据创建和DRF leaves the other 1% to third-party libraries。
在Django REST framework 2.x和3.x中,第三方包exists for this。
现在,您正在尝试进行批量创建,但返回的错误是
这是因为您正在发送一个要创建的对象列表,而不是只发送一个。您可以通过几种方法来解决这个问题,但最简单的方法是当序列化程序是一个列表时,只对它进行override ^{} on your view 到add the ^{} flag 操作。
这将允许Django REST框架知道在批量创建对象时自动使用
ListSerializer
。现在,对于其他操作(如更新和删除),您需要覆盖默认路由。我假设您使用的是routes provided by Django REST framework bulk,但是您可以随意使用任何方法名。您还需要向视图中添加bulk
PUT
和PATCH
的方法。这不是现成的,因为Django REST框架默认不支持批量更新。这意味着你也have to implement your own bulk updates。当前代码将处理大容量更新,就像您试图更新整个列表一样,这就是以前的大容量更新包的工作方式。
虽然你没有要求批量删除,但这并不特别困难。
这与删除所有对象的效果相同,与旧的大容量插件相同。
这些代码都没有经过测试。如果它不起作用,就把它当作一个详细的例子。
相关问题 更多 >
编程相关推荐