我在閱讀有關定製多個更新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