@@ -79,27 +79,21 @@ def _phone_country_code_to_iso_code(phone_country_code: str) -> str:
7979class 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