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

无外键关联的Django模型如何用ORM实现指定MySQL查询

可以用Django ORM重构该MySQL查询语句

实现代码

from django.db.models import Sum, F

# 替换为实际传入的meta_id参数值
meta_id = "你的参数内容"

# 方式一:子查询关联(推荐,与原SQL逻辑高度匹配)
queryset = AggUii.objects.filter(
    doc_id__in=HierarchieIndexDocid.objects.filter(ancestor=meta_id).values_list('descendant_docid', flat=True)
).values('year').annotate(total_counts=Sum('counts')).order_by('year')

# 方式二:跨表条件过滤(无外键时也可生效)
queryset = AggUii.objects.filter(
    hierarchieindexdocid__ancestor=meta_id,
    hierarchieindexdocid__descendant_docid=F('doc_id')
).values('year').annotate(total_counts=Sum('counts')).order_by('year')

代码说明

  1. 子查询方式:先从HierarchieIndexDocid表筛选出ancestor等于meta_id的所有descendant_docid,再通过doc_id__in匹配AggUii表的记录,完全对应原SQL的内连接逻辑。
  2. 跨表过滤方式:利用Django ORM的隐式关联能力,通过模型名小写的形式跨表指定过滤条件,用F('doc_id')引用当前模型字段值实现关联匹配。
  3. 分组与求和:
    • values('year')指定按year字段分组
    • annotate(total_counts=Sum('counts'))计算每组的counts总和,结果字段名为total_counts
    • order_by('year')保证结果按年份升序排列(可选,按需调整)

注意事项

  • 若year或counts存在空值,可追加filter(year__isnull=False, counts__isnull=False)排除无效数据,避免求和结果异常。
  • 可通过print(queryset.query)查看生成的SQL语句,验证与原生查询的一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:22:47