@@ -90,13 +90,28 @@ async def query(
9090 session : SessionDep ,
9191 keyword : Union [str , None ] = Query (default = None , max_length = 255 , description = f"{ PLACEHOLDER_PREFIX } keyword" )
9292):
93- statement = select (AiModelDetail .id ,
94- AiModelDetail .name ,
95- AiModelDetail .model_type ,
96- AiModelDetail .base_model ,
97- AiModelDetail .supplier ,
98- AiModelDetail .protocol ,
99- AiModelDetail .default_model )
93+ # 子查询:统计每个 model 绑定的 workspace 数量
94+ count_sub = (
95+ select (
96+ AiModelWorkspaceMapping .ai_model_id ,
97+ func .count ().label ("ws_mapping_count" )
98+ )
99+ .group_by (AiModelWorkspaceMapping .ai_model_id )
100+ .subquery ()
101+ )
102+ statement = (
103+ select (
104+ AiModelDetail .id ,
105+ AiModelDetail .name ,
106+ AiModelDetail .model_type ,
107+ AiModelDetail .base_model ,
108+ AiModelDetail .supplier ,
109+ AiModelDetail .protocol ,
110+ AiModelDetail .default_model ,
111+ func .coalesce (count_sub .c .ws_mapping_count , 0 ).label ("ws_mapping_count" ),
112+ )
113+ .outerjoin (count_sub , AiModelDetail .id == count_sub .c .ai_model_id )
114+ )
100115 if keyword is not None :
101116 statement = statement .where (AiModelDetail .name .like (f"%{ keyword } %" ))
102117 statement = statement .order_by (AiModelDetail .default_model .desc (), AiModelDetail .name , AiModelDetail .create_time )
0 commit comments