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

如何在Django ORM按关联ID过滤时避免表连接?

解决方案:避免Django ORM查询时的不必要表连接

当然可以!你遇到的这个情况是因为Django ORM解析category__id这种跨关联模型的查询语法时,默认会生成表连接操作。但其实我们可以直接针对Project模型自身的外键字段来过滤,完全不需要关联Category表。

正确的查询写法

直接使用Project模型中外键对应的数据库字段名(Django默认会为外键字段自动生成[外键名]_id格式的数据库字段):

projects = Project.objects.filter(category_id=1111)

为什么这能避免表连接?

  • 当你写category__id时,ORM会理解为“通过关联的Category模型的id字段来过滤Project”,所以会自动生成INNER JOIN来关联两张表。
  • 而直接写category_id,是直接对Project表本身的category_id字段进行过滤,ORM不需要关联任何其他表,生成的SQL就是你想要的:
    select * FROM "project" WHERE "project"."category_id" = 1111
    

特殊情况:自定义外键数据库字段名

如果你的外键字段在定义时指定了db_column参数(比如:category = models.ForeignKey(Category, db_column='cat_id')),那就要用你自定义的字段名来过滤:

projects = Project.objects.filter(cat_id=1111)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:35:12