django action 自定义路由中调整 queryset
背景
比如在自定以的路由中想修改 数据集, 但是又不想全部重写内置的方法的场景
如我的已办, 本质上是完全调用list方法的
实现
源码部分
源码部分不建议修改, 但是可以通过重写一个 ListModelMixin 重新复制一份, 从而可以实现源码的所有功能
在此基础上进行修改在不定参中定制一个字段来接收并覆盖原有的 queryset 皆可
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
if kwargs.get("queryset"):
queryset = self.filter_queryset(kwargs["queryset"])
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return response(serializer.data)
视图部分
通过 kwargs 把要复写的 queryset 传递过去即可, 从而避免大量的重复代码
@action(methods=["GET"], detail=False, description="已办列表")
def got_list(self, request, *args, **kwargs):
user_name = request.query_params.get("username", request.user.u_name or request.user.username)
kwargs["queryset"] = models.AutoOrder.objects.filter(o_logs_a__operator=user_name).distinct()
return super().list(request, *args, **kwargs)
本文来自博客园,作者:羊驼之歌,转载请注明原文链接:https://www.cnblogs.com/shijieli/p/15878047.html