【发布时间】:2015-03-08 07:43:17
【问题描述】:
我正在阅读有关自定义多个更新 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
我的网址设置使用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 中的新功能,看起来这应该可以工作,但我只是缺少一些约定或一些选项.
【问题讨论】:
标签: python django django-rest-framework