pet*_*yum 23 python django django-rest-framework
我正在阅读这里有关自定义多个更新的内容,我还没想到在什么情况下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
Run Code Online (Sandbox Code Playgroud)
和我的ViewSet
# api.py
class BookViewSet(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
Run Code Online (Sandbox Code Playgroud)
我的网址设置使用 DefaultRouter
# urls.py
router = routers.DefaultRouter()
router.register(r'Book', BookViewSet)
urlpatterns = patterns('',
url(r'^api/', include(router.urls)),
...
Run Code Online (Sandbox Code Playgroud)
所以我使用了这个设置,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} ]
Run Code Online (Sandbox Code Playgroud)
但它似乎仍然使用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中的新功能,看起来这应该可行,但我只是缺少一些约定或某些选项.
Kev*_*own 39
默认情况下,Django REST框架假定您不处理批量数据创建,更新或删除.这是因为99%的人不处理批量数据创建,DRF将另外1%的人留给第三方库.
在Django REST框架2.x和3.x中,存在第三方包.
现在,您正在尝试进行批量创建,但是您收到的错误就是说
无效数据.期待一本字典,但得到了一份清单
这是因为您要发送要创建的对象列表,而不是仅发送一个.您可以通过以下几种方式解决这个问题,但最简单的方法就是覆盖get_serializer
视图,以便在列表中将many=True
标记添加到序列化程序中.
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)
Run Code Online (Sandbox Code Playgroud)
这将允许Django REST框架知道ListSerializer
在批量创建对象时自动使用.现在,对于其他操作(如更新和删除),您将需要覆盖默认路由.我将假设您正在使用Django REST框架批量提供的路由,但您可以自由使用您想要的任何方法名称.
您还需要为批量PUT
和PATCH
视图添加方法.
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)
Run Code Online (Sandbox Code Playgroud)
由于Django REST框架默认不支持批量更新,因此无法开箱即用.这意味着您还必须实施自己的批量更新.当前代码将处理批量更新,就像您尝试更新整个列表一样,这是旧批量更新包以前的工作方式.
虽然您没有要求批量删除,但这并不是特别困难.
def bulk_delete(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
self.perform_delete(queryset)
return Response(status=204)
Run Code Online (Sandbox Code Playgroud)
这与删除所有对象具有相同的效果,与旧的批量插件相同.
这些代码都没有经过测试.如果它不起作用,请将其视为一个详细示例.
归档时间: |
|
查看次数: |
10932 次 |
最近记录: |