我正在尝试在我的 Django API 上执行批量删除/PUT,mymodel
继承自MultipleDBModelViewSet
而又继承自BulkModelViewSet
批量销毁方法如下
class MultipleDBModelViewSet(BulkModelViewSet):
...
...
def bulk_destroy(self, request, *args, **kwargs):
ids = json.loads(request.query_params.get("ids"))
if not ids:
return super().destroy(request, *args, pk=kwargs.pop("pk"), **kwargs)
else:
return super().bulk_destroy(request, *args, **kwargs)
在我的urls.py
文件中,我定义了用于与模型交互的URL:
router.register(r"v1/mymodels", mymodels_views_v1.MyModelViewSet)
这允许我在 URL 上获取、发布、放置和删除(目前运行良好(:
www.my-api.com/v1/mymodels/{{mymodel_id}}
是否可以将同一 URL 用于批量操作?如果是这样,正确的语法是什么?
例如:www.my-api.com/v1/mymodels/?ids=[{{mymodel_id1}},{{mymodel_id2}}]
如果没有,我应该进行哪些更改?
谢谢
他们在文档中说了两件事。
-
大多数 API URL 对每个资源都有两个 URL 级别:
url(r'foo/', ...) url(r'foo/(?P<pk>d+)/', ...)
但是,第二个 url 不适用于批量操作,因为URL 直接映射到单个资源。因此所有散装通用视图仅适用于第一个 URL。
这意味着它不会接受网址kwarg参数。
- 唯一的例外是批量删除。考虑删除请求到第一个网址。这可能会删除所有资源,而无需任何特别确认。要尝试解决此问题,请批量删除mixin 允许实现一个钩子来确定是否批量删除应允许请求:
class FooView(BulkDestroyAPIView):
def allow_bulk_destroy(self, qs, filtered):
# custom logic here
# default checks if the qs was filtered
# qs comes from self.get_queryset()
# filtered comes from self.filter_queryset(qs)
return qs is not filtered
溶液:-你可以这样做
class SimpleViewSet(generics.BulkModelViewSet):
def filter_queryset(self, queryset):
ids = self.request.query_params.get('ids')
if ids:
return queryset.filter(id__in=ids.split(',')
# returns normal query set if no param
return queryset