From e153ee6d5461b38dced6c6d5b331e19e34ed1f77 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 20 Mar 2026 08:43:23 +0800 Subject: [PATCH] perf(permission): batch load dept scopes --- apps/utils/viewsets.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/apps/utils/viewsets.py b/apps/utils/viewsets.py index f0deabc0..20ac4b6b 100755 --- a/apps/utils/viewsets.py +++ b/apps/utils/viewsets.py @@ -206,20 +206,34 @@ class CustomGenericViewSet(MyLoggingMixin, GenericViewSet): elif action_str == '*': return queryset elif action_str in user_perms_map: + scope_map = user_perms_map[action_str] new_queryset = queryset.none() - for dept_id, data_range in user_perms_map[action_str].items(): - dept = Dept.objects.get(id=dept_id) + dept_ids = list(scope_map.keys()) + dept_map = Dept.objects.in_bulk(dept_ids) + for dept_id, data_range in scope_map.items(): + scoped_queryset = queryset if data_range == DataFilter.ALL: return queryset elif data_range == DataFilter.SAMELEVE_AND_BELOW: - queryset = self.filter_s_a_b(queryset, dept) + dept = dept_map.get(dept_id) + if dept is None: + continue + scoped_queryset = self.filter_s_a_b(scoped_queryset, dept) elif data_range == DataFilter.THISLEVEL_AND_BELOW: - queryset = self.filter_t_a_b(queryset, dept) + dept = dept_map.get(dept_id) + if dept is None: + continue + scoped_queryset = self.filter_t_a_b(scoped_queryset, dept) elif data_range == DataFilter.THISLEVEL: - queryset = self.filter_t(queryset, dept) + dept = dept_map.get(dept_id) + if dept is None: + continue + scoped_queryset = self.filter_t(scoped_queryset, dept) elif data_range == DataFilter.MYSELF: - queryset = queryset.filter(create_by=user) - new_queryset = new_queryset | queryset + scoped_queryset = scoped_queryset.filter(create_by=user) + else: + continue + new_queryset = new_queryset | scoped_queryset return new_queryset else: return queryset.none()