Skip to content

Commit 5f9b855

Browse files
authored
fix(open api v2 - list user): wrong use paginate_queryset result (#2313)
1 parent c99bec0 commit 5f9b855

1 file changed

Lines changed: 19 additions & 14 deletions

File tree

src/bk-user/bkuser/apis/open_v2/views/profilers.py

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,27 +79,21 @@ def _phone_country_code_to_iso_code(phone_country_code: str) -> str:
7979
class TenantUserListToUserInfosMixin(DefaultTenantMixin, DataSourceDomainMixin):
8080
"""将 TenantUser 列表转换 对外的用户信息"""
8181

82-
def build_user_infos(self, tenant_users: QuerySet[TenantUser], fields: List[str]) -> List[Dict[str, Any]]:
82+
def build_user_infos(self, tenant_users: List[TenantUser], fields: List[str]) -> List[Dict[str, Any]]:
8383
"""
8484
构建对外用户信息列表
85-
:param tenant_users: 租户用户 Queryset,即已经经过 filter 等后的 QuerySet
85+
:param tenant_users: 租户用户 List,即已经经过 filter、only 等优化后的数据
8686
且必须保证 select_related("data_source_user")
87-
:param fields: 对外的用户字段列表,空时表示所有用户字段都对外
87+
:param fields: 对外的用户字段列表,需要已经标准化处理(调用 _get_default_fields)
8888
"""
89-
# 标准化字段列表
90-
fields = self._get_default_fields(fields)
91-
92-
# 优化查询:只查询需要的数据库字段
93-
tenant_users = self._optimize_queryset(tenant_users, fields)
94-
9589
# 批量预加载关联数据
9690
context = self._prepare_context(tenant_users, fields)
9791

9892
# 构建每个用户的信息
9993
return [self._build_single_user_info(tenant_user, fields, context) for tenant_user in tenant_users]
10094

10195
@staticmethod
102-
def _get_default_fields(fields: List[str]) -> List[str]:
96+
def get_default_fields(fields: List[str]) -> List[str]:
10397
"""获取默认字段列表"""
10498
return fields or [
10599
"id",
@@ -146,15 +140,15 @@ def _get_db_field_map() -> Dict[str, List[str]]:
146140
"departments": ["data_source_user__id"],
147141
}
148142

149-
def _optimize_queryset(self, tenant_users: QuerySet[TenantUser], fields: List[str]) -> QuerySet[TenantUser]:
143+
def optimize_queryset(self, tenant_users: QuerySet[TenantUser], fields: List[str]) -> QuerySet[TenantUser]:
150144
"""优化查询,只查询需要的数据库字段"""
151145
db_field_map = self._get_db_field_map()
152146
only_fields = {"id"}
153147
for f in fields:
154148
only_fields.update(db_field_map.get(f, []))
155149
return tenant_users.only(*only_fields)
156150

157-
def _prepare_context(self, tenant_users: QuerySet[TenantUser], fields: List[str]) -> Dict[str, Any]:
151+
def _prepare_context(self, tenant_users: List[TenantUser], fields: List[str]) -> Dict[str, Any]:
158152
"""预加载关联数据,减少数据库查询"""
159153
data_source_user_ids = [i.data_source_user.id for i in tenant_users]
160154

@@ -387,11 +381,17 @@ def get(self, request, *args, **kwargs):
387381

388382
# 根据参数过滤
389383
tenant_users = self._filter_queryset(params)
384+
385+
# 在分页前 (不分页也需优化) 进行 queryset 优化(只查询需要的字段)要的字段
386+
fields = params.get("fields")
387+
fields = self.get_default_fields(fields)
388+
tenant_users = self.optimize_queryset(tenant_users, fields)
389+
390390
if not no_page:
391391
tenant_users = self.paginate_queryset(tenant_users)
392392

393393
# 根据 fields 构造对外的用户信息
394-
user_infos = self.build_user_infos(tenant_users, params.get("fields"))
394+
user_infos = self.build_user_infos(tenant_users, fields)
395395
if not no_page:
396396
return self.get_paginated_response(user_infos)
397397

@@ -775,11 +775,16 @@ def get(self, request, *args, **kwargs):
775775

776776
# 根据部门、是否递归,过滤出 部门下的用户
777777
tenant_users = self._filter_queryset(tenant_dept, params.get("recursive"))
778+
779+
# 在分页前 (不分页也需优化) 进行 queryset 优化(只查询需要的字段)要的字段
780+
fields = self.get_default_fields([])
781+
tenant_users = self.optimize_queryset(tenant_users, fields)
782+
778783
if not no_page:
779784
tenant_users = self.paginate_queryset(tenant_users)
780785

781786
# 不指定用户字段
782-
user_infos = self.build_user_infos(tenant_users, [])
787+
user_infos = self.build_user_infos(tenant_users, fields)
783788
if not no_page:
784789
return self.get_paginated_response(user_infos)
785790

0 commit comments

Comments
 (0)