feat: base 提供查询子集数据方法
This commit is contained in:
parent
a1ef065e8c
commit
e7f8086f23
|
@ -2,22 +2,27 @@ from django.apps import apps
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
|
||||||
|
|
||||||
def get_child_queryset_u(checkQueryset, obj, hasParent=True):
|
def get_child_queryset_u(checkQueryset, hasParent=True):
|
||||||
'''
|
'''
|
||||||
获取所有子集
|
获取所有子集
|
||||||
查的范围checkQueryset
|
查的范围checkQueryset
|
||||||
父obj
|
父obj
|
||||||
是否包含父默认True
|
是否包含父默认True
|
||||||
'''
|
'''
|
||||||
cls = type(obj)
|
cls = type(checkQueryset.model)
|
||||||
queryset = cls.objects.none()
|
if hasattr(cls, 'parent'):
|
||||||
if hasParent:
|
queryset = cls.objects.none()
|
||||||
queryset = cls.objects.filter(pk=obj.id)
|
if hasParent:
|
||||||
child_queryset = checkQueryset.filter(parent=obj)
|
queryset = checkQueryset
|
||||||
while child_queryset.exists():
|
child_queryset = checkQueryset.filter(parent__in=queryset)
|
||||||
queryset = queryset | child_queryset
|
while child_queryset.exists():
|
||||||
child_queryset = checkQueryset.filter(parent__in=child_queryset)
|
queryset = queryset | child_queryset
|
||||||
return queryset
|
child_queryset = checkQueryset.filter(parent__in=child_queryset)
|
||||||
|
return queryset
|
||||||
|
elif hasParent:
|
||||||
|
return checkQueryset
|
||||||
|
else:
|
||||||
|
return checkQueryset.none()
|
||||||
|
|
||||||
|
|
||||||
def get_child_queryset(name, pk, hasParent=True):
|
def get_child_queryset(name, pk, hasParent=True):
|
||||||
|
|
|
@ -12,7 +12,7 @@ from apps.system.models import DataFilter, Dept, User
|
||||||
from apps.utils.errors import PKS_ERROR
|
from apps.utils.errors import PKS_ERROR
|
||||||
from apps.utils.mixins import MyLoggingMixin, BulkCreateModelMixin, BulkUpdateModelMixin, BulkDestroyModelMixin
|
from apps.utils.mixins import MyLoggingMixin, BulkCreateModelMixin, BulkUpdateModelMixin, BulkDestroyModelMixin
|
||||||
from apps.utils.permission import ALL_PERMS, RbacPermission, get_user_perms_map
|
from apps.utils.permission import ALL_PERMS, RbacPermission, get_user_perms_map
|
||||||
from apps.utils.queryset import get_child_queryset2
|
from apps.utils.queryset import get_child_queryset2, get_child_queryset_u
|
||||||
from apps.utils.serializers import PkSerializer, ComplexSerializer
|
from apps.utils.serializers import PkSerializer, ComplexSerializer
|
||||||
from rest_framework.throttling import UserRateThrottle
|
from rest_framework.throttling import UserRateThrottle
|
||||||
from drf_yasg.utils import swagger_auto_schema
|
from drf_yasg.utils import swagger_auto_schema
|
||||||
|
@ -100,6 +100,15 @@ class CustomGenericViewSet(MyLoggingMixin, GenericViewSet):
|
||||||
queryset = queryset.select_related(*self.select_related_fields)
|
queryset = queryset.select_related(*self.select_related_fields)
|
||||||
if self.prefetch_related_fields:
|
if self.prefetch_related_fields:
|
||||||
queryset = queryset.prefetch_related(*self.prefetch_related_fields)
|
queryset = queryset.prefetch_related(*self.prefetch_related_fields)
|
||||||
|
|
||||||
|
# 查询出子集数据,请谨慎使用
|
||||||
|
has_children = self.request.query_params.get('has_children', 'no')
|
||||||
|
if has_children == 'hasparent':
|
||||||
|
queryset = get_child_queryset_u(queryset, True)
|
||||||
|
elif has_children == 'noparent':
|
||||||
|
queryset = get_child_queryset_u(queryset, False)
|
||||||
|
else:
|
||||||
|
pass
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
|
|
Loading…
Reference in New Issue