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

求可单次查询数据库两个不同表的Django查询语句示例

Django 单次查询获取多表聚合数据示例

原有实现(两次独立查询)

data = Insuree.objects.filter(gender='F').count()
data2 = Service.objects.filter(code='F4').count()

方案1:使用Django ORM子查询实现单次查询

通过Subquery和aggregate将两个统计逻辑合并为一次数据库查询:

from django.db.models import Subquery, Count, IntegerField

# 定义两个子查询分别计算对应统计值
female_insuree_subquery = Insuree.objects.filter(gender='F').annotate(count=Count('pk')).values('count')
f4_service_subquery = Service.objects.filter(code='F4').annotate(count=Count('pk')).values('count')

# 聚合两个子查询结果,生成单次查询
result = Insuree.objects.aggregate(
    female_insuree_count=Subquery(female_insuree_subquery, output_field=IntegerField()),
    f4_service_count=Subquery(f4_service_subquery, output_field=IntegerField())
)

# 结果格式:{'female_insuree_count': 123, 'f4_service_count': 456}

方案2:使用原生SQL实现单次查询

如果对性能要求更高,或者需要更灵活的SQL控制,可以直接执行原生SQL:

from django.db import connection

with connection.cursor() as cursor:
    cursor.execute("""
        SELECT 
            (SELECT COUNT(*) FROM insuree WHERE gender = 'F') AS female_insuree_count,
            (SELECT COUNT(*) FROM service WHERE code = 'F4') AS f4_service_count
    """)
    row = cursor.fetchone()
    result = {
        'female_insuree_count': row[0],
        'f4_service_count': row[1]
    }

方案对比

  • ORM子查询:保持Django代码风格,无需手动编写SQL,维护性强,适合常规场景。
  • 原生SQL:查询性能略优,适合复杂查询场景或需要精细控制SQL执行逻辑的情况。

内容的提问来源于stack exchange,提问作者MBOU LONTSI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:50:30