如何在Django中正确统计城市的医院数量与患者数量?
解决方法
你的查询出错是因为同时关联Hospital和Patient表时产生了笛卡尔积,导致计数结果是两个表记录数的乘积,而非实际数量。以下是两种正确实现方式:
方式一:使用distinct参数去重计数
直接在Count中添加distinct=True,确保每个主键只被统计一次:
City.objects.values('name').annotate( patients_no=Count('patients__pk', distinct=True), hospitals_no=Count('hospital__pk', distinct=True) )
方式二:使用子查询分别统计
通过子查询单独计算每个城市的医院数和患者数,完全避免笛卡尔积问题:
from django.db.models import Subquery, OuterRef, Count # 子查询:获取每个城市的医院数量 hospital_count_sub = Hospital.objects.filter( city=OuterRef('pk') ).values('city').annotate(count=Count('pk')).values('count') # 子查询:获取每个城市的患者数量 patient_count_sub = Patient.objects.filter( city=OuterRef('pk') ).values('city').annotate(count=Count('pk')).values('count') # 主查询整合结果 city_stats = City.objects.annotate( hospitals_no=Subquery(hospital_count_sub), patients_no=Subquery(patient_count_sub) ).values('name', 'hospitals_no', 'patients_no')
补充说明
- 方式一适合简单场景,代码更简洁;
- 方式二在关联表数据量大时性能更优,逻辑也更清晰。
内容的提问来源于stack exchange,提问作者art
相关产品推荐
相关产品推荐

