如何用Django ORM查询所有系统及关联页面数量(无需循环)
用Django ORM实现系统与对应页面数量的查询(无循环)
你可以通过Django ORM的annotate()结合Count()聚合函数实现需求,一次数据库查询就能获取所有系统及其对应的页面数量,完全不需要在查询阶段使用循环。
实现步骤:
- 先导入Django的聚合函数
Count:
from django.db.models import Count
- 执行查询:
如果你的SystemPagesTable模型中外键未指定related_name,直接使用Django自动生成的反向关联名称:
systems_with_page_count = SystemTable.objects.annotate( NUM_OF_PAGES=Count('system_pages_table_set') ).all()
优化建议(可选):
为了让代码更易读,建议修改SystemPagesTable的外键字段,添加related_name:
# 修改SystemPagesTable中的外键定义 system = models.ForeignKey(SystemTable, on_delete=models.CASCADE, related_name='pages')
此时查询代码可简化为:
systems_with_page_count = SystemTable.objects.annotate( NUM_OF_PAGES=Count('pages') ).all()
使用方式:
查询结果中的每个SystemTable对象都会新增NUM_OF_PAGES属性,直接访问即可获取对应系统的页面总数:
for system in systems_with_page_count: print(f"系统{system.system_name}的页面数量:{system.NUM_OF_PAGES}")
这里的循环仅用于遍历展示结果,并非查询过程中的循环,核心查询逻辑是数据库层面一次性完成的,不会产生N+1性能问题。
内容的提问来源于stack exchange,提问作者Maher
相关产品推荐
相关产品推荐

