[Update] 优化sql, or方式改为union (#3682)

* [Update] 优化sql, or方式改为union

* [Update] 优化union操作,直接union后,queryset 的一些参数不能使用,如annoate, 如filter assets__isnull=True
This commit is contained in:
老广
2020-02-05 15:56:28 +08:00
committed by GitHub
parent aa2255a87e
commit 3c69860b24
7 changed files with 53 additions and 34 deletions

View File

@@ -1,11 +1,9 @@
# -*- coding: utf-8 -*-
#
from django.db.models import Q
from common.permissions import IsOrgAdmin
from orgs.mixins.api import OrgModelViewSet
from common.utils import get_object_or_none
from common.utils import get_object_or_none, union_queryset
from ..models import AssetPermission
from ..hands import (
User, UserGroup, Asset, Node, SystemUser,
@@ -111,9 +109,9 @@ class AssetPermissionViewSet(OrgModelViewSet):
continue
ancestor_keys = Node.get_node_ancestor_keys(key, with_self=True)
inherit_all_nodes.update(ancestor_keys)
queryset = queryset.filter(
Q(assets__in=assets) | Q(nodes__key__in=inherit_all_nodes)
).distinct()
assets_queryset = queryset.filter(assets__in=assets)
nodes_queryset = queryset.filter(nodes__key__in=inherit_all_nodes)
queryset = union_queryset(assets_queryset, nodes_queryset)
return queryset
def filter_user(self, queryset):
@@ -131,9 +129,9 @@ class AssetPermissionViewSet(OrgModelViewSet):
queryset = queryset.filter(users=user)
return queryset
groups = user.groups.all()
queryset = queryset.filter(
Q(users=user) | Q(user_groups__in=groups)
).distinct()
users_queryset = queryset.filter(users=user)
groups_queryset = queryset.filter(user_groups__in=groups)
queryset = union_queryset(users_queryset, groups_queryset)
return queryset
def filter_user_group(self, queryset):