TOP

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)

 

posted @ 2022-02-10 10:26  羊驼之歌  阅读(220)  评论(0编辑  收藏  举报