进行了完整的视图拆分,同步了 merchant_ops 的修改
This commit is contained in:
@@ -188,57 +188,73 @@ class KhgglView(APIView):
|
||||
end = start + page_size
|
||||
shenheguan_list = queryset.order_by('-CreateTime')[start:end]
|
||||
|
||||
from collections import defaultdict
|
||||
from jituan.services.shenhe_club import yonghu_chenghao_qs_for_request
|
||||
|
||||
# ---------- 预计算每个板块的打手数量 ----------
|
||||
bankuai_dashou_count_map = {}
|
||||
all_banquai = Bankuai.query.all()
|
||||
for bk in all_banquai:
|
||||
tag_ids = Chenghao.query.filter(bankuai=bk, leixing='dashou').values_list('id', flat=True)
|
||||
count = yonghu_chenghao_qs_for_request(
|
||||
YonghuChenghao.query.filter(
|
||||
chenghao_id__in=tag_ids,
|
||||
yonghu__DashouProfile__isnull=False,
|
||||
),
|
||||
request,
|
||||
).values('yonghu').distinct().count()
|
||||
bankuai_dashou_count_map[bk.bankuai_id] = count
|
||||
# ---------- 优化:板块打手数量(1 次 annotate 替代 2N 次循环查询)----------
|
||||
# 原逻辑:每板块查 dashou 标签 ID,再统计关联的不同用户数(要求有 DashouProfile)
|
||||
bankuai_dashou_qs = yonghu_chenghao_qs_for_request(
|
||||
YonghuChenghao.query.filter(
|
||||
chenghao__leixing='dashou',
|
||||
yonghu__DashouProfile__isnull=False,
|
||||
),
|
||||
request,
|
||||
)
|
||||
bankuai_dashou_count_map = {
|
||||
item['chenghao__bankuai_id']: item['user_count']
|
||||
for item in bankuai_dashou_qs.values('chenghao__bankuai_id').annotate(
|
||||
user_count=Count('yonghu', distinct=True)
|
||||
)
|
||||
}
|
||||
|
||||
# ---------- 新增:板块标签统计 ----------
|
||||
bankuai_tags_data = []
|
||||
for bk in all_banquai:
|
||||
tags = Chenghao.query.filter(bankuai=bk, leixing='dashou')
|
||||
tag_list = []
|
||||
for tag in tags:
|
||||
user_count = yonghu_chenghao_qs_for_request(
|
||||
YonghuChenghao.query.filter(chenghao=tag),
|
||||
request,
|
||||
).values('yonghu').distinct().count()
|
||||
tag_list.append({
|
||||
'id': tag.id,
|
||||
'name': tag.mingcheng,
|
||||
'user_count': user_count,
|
||||
})
|
||||
bankuai_tags_data.append({
|
||||
# ---------- 优化:板块标签统计(1 次 annotate 替代 N*M 次循环查询)----------
|
||||
# 原逻辑:每板块每标签分别统计关联的不同用户数(不要求 DashouProfile)
|
||||
tag_counts_qs = yonghu_chenghao_qs_for_request(
|
||||
YonghuChenghao.query.filter(chenghao__leixing='dashou'),
|
||||
request,
|
||||
).values(
|
||||
'chenghao_id', 'chenghao__bankuai_id', 'chenghao__mingcheng'
|
||||
).annotate(user_count=Count('yonghu', distinct=True))
|
||||
|
||||
tags_by_bankuai = defaultdict(list)
|
||||
for item in tag_counts_qs:
|
||||
tags_by_bankuai[item['chenghao__bankuai_id']].append({
|
||||
'id': item['chenghao_id'],
|
||||
'name': item['chenghao__mingcheng'],
|
||||
'user_count': item['user_count'],
|
||||
})
|
||||
|
||||
all_banquai = Bankuai.query.all()
|
||||
bankuai_tags_data = [
|
||||
{
|
||||
'bankuai_id': bk.bankuai_id,
|
||||
'mingcheng': bk.mingcheng,
|
||||
'tags': tag_list,
|
||||
})
|
||||
'tags': tags_by_bankuai.get(bk.bankuai_id, []),
|
||||
}
|
||||
for bk in all_banquai
|
||||
]
|
||||
|
||||
# ---------- 优化:审核官板块关联(1 次批量查询替代 P 次循环查询)----------
|
||||
shenheguan_user_uids = [sg.user.UserUID for sg in shenheguan_list]
|
||||
all_kgs = KaoheguanBankuai.query.filter(
|
||||
kaoheguan_id__in=shenheguan_user_uids
|
||||
).select_related('bankuai')
|
||||
kg_map = defaultdict(list)
|
||||
for kg in all_kgs:
|
||||
kg_map[kg.kaoheguan_id].append(kg)
|
||||
|
||||
# 构造返回数据(审核官列表)
|
||||
data_list = []
|
||||
for sg in shenheguan_list:
|
||||
user = sg.user
|
||||
# 获取该审核官关联的板块
|
||||
bk_qs = KaoheguanBankuai.query.filter(kaoheguan_id=user.UserUID).select_related('bankuai')
|
||||
bankuai_info = []
|
||||
for bk in bk_qs:
|
||||
bid = bk.bankuai.bankuai_id
|
||||
bankuai_info.append({
|
||||
'bankuai_id': bid,
|
||||
'mingcheng': bk.bankuai.mingcheng,
|
||||
'dashou_count': bankuai_dashou_count_map.get(bid, 0)
|
||||
})
|
||||
bankuai_info = [
|
||||
{
|
||||
'bankuai_id': kg.bankuai.bankuai_id,
|
||||
'mingcheng': kg.bankuai.mingcheng,
|
||||
'dashou_count': bankuai_dashou_count_map.get(kg.bankuai.bankuai_id, 0),
|
||||
}
|
||||
for kg in kg_map.get(user.UserUID, [])
|
||||
]
|
||||
|
||||
dashou_nick = user.DashouProfile.nicheng if hasattr(user, 'DashouProfile') and user.DashouProfile else ''
|
||||
|
||||
|
||||
Reference in New Issue
Block a user