我在阅读有关定制多个更新here,我还没有想出在什么情况下调用自定义ListSerializer
更新方法。我想一次更新多个对象,我并不担心目前多次创建或删除。如何发布/放JSON数据到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
而且使用DefaultRouter
# urls.py
router = routers.DefaultRouter()
router.register(r'Book', BookViewSet)
urlpatterns = patterns('',
url(r'^api/', include(router.urls)),
...
我的网址设置,使我有这样的设置使用DefaultRouter
因此/api/Book/
将使用BookSerializer
。
是一般的想法,如果我POST/PUT/PATCH一个数组的JSON对象/api/Book/
那么串行器应该切换到BookListSerializer
?
我试过POST/PUT/PATCH JSON数据列表这个/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
错误。
问题: 我必须调整DefaultRouter
或BookViewSet
的allowed_methods
允许列表中的POST/PATCH/PUT?通用视图是否设置为与ListSerializer
一起使用?
我知道我可以为此编写自己的列表反序列化器,但我试图保持与DRF 3中的新功能的最新,它看起来像这应该工作,但我只是缺少一些约定或一些选项。
谢谢。修正了。现在我将一个列表提交给'/ api/Book /'。如果我通过POST提交,我会得到'无效的数据。期望一个字典,但有list.',如果我通过PATCH或PUT提交,那么我得到一个'Method'PATCH'不允许。“。如果有帮助,我使用'DefaultRouter'和'ModelViewSet'。 – petroleyum 2015-01-10 21:33:48
我已经更新了答案,详细解答了您的问题**。希望它涵盖了你的问题的多个部分。幸运的是,第三方软件包将在不久的将来更新到支持3.0。 – 2015-01-11 01:19:34
太棒了,谢谢。我想我的问题可能被归结为“现在3.0看起来DRF现在有一些默认的批量更新行为?”答案是“不完全”。您的代码示例正是我所需要的,我会对其进行测试并在必要时进行更新。 – petroleyum 2015-01-11 14:24:16