无外键关联的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')
代码说明
- 子查询方式:先从
HierarchieIndexDocid表筛选出ancestor等于meta_id的所有descendant_docid,再通过doc_id__in匹配AggUii表的记录,完全对应原SQL的内连接逻辑。 - 跨表过滤方式:利用Django ORM的隐式关联能力,通过模型名小写的形式跨表指定过滤条件,用
F('doc_id')引用当前模型字段值实现关联匹配。 - 分组与求和:
values('year')指定按year字段分组annotate(total_counts=Sum('counts'))计算每组的counts总和,结果字段名为total_countsorder_by('year')保证结果按年份升序排列(可选,按需调整)
注意事项
- 若
year或counts存在空值,可追加filter(year__isnull=False, counts__isnull=False)排除无效数据,避免求和结果异常。 - 可通过
print(queryset.query)查看生成的SQL语句,验证与原生查询的一致性。
内容的提问来源于stack exchange,提问作者Py_Bear
相关产品推荐
相关产品推荐

