You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:41:39