Django rest 框架批量:批量操作的正确 URL 语法



我正在尝试在我的 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}}]

如果没有,我应该进行哪些更改?

谢谢

他们在文档中说了两件事。

  1. 大多数 API URL 对每个资源都有两个 URL 级别:

    url(r'foo/', ...)
    url(r'foo/(?P<pk>d+)/', ...)
    

    但是,第二个 url 不适用于批量操作,因为URL 直接映射到单个资源。因此所有散装通用视图仅适用于第一个 URL。

这意味着它不会接受网址kwarg参数。

  1. 唯一的例外是批量删除。考虑删除请求到第一个网址。这可能会删除所有资源,而无需任何特别确认。要尝试解决此问题,请批量删除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

最新更新