很抱歉非特定问题,但我想这可能是一个有趣的问题。至少对我而言;)
我正在使用django模型一次从几个相关表中获取数据。当QuerySet得到应用时,我宁愿让django像这样进行查询:
SELECT t1.field1, t1.field2, t2.field1, t2.field2 FROM t1
JOIN t2 ON (t1.fk_t2 = t2.pk);
但不是我所想到的,我可以看到Django做这样的事情:
SELECT t1.field1, t1.field2, t1.fk_t2 FROM t1;
然后是所有t1.fk_t2
SELECT t2.field1, t2.field2 FROM t2 WHERE id = (here comes some single id);
这是默认的Django行为吗?为什么会这样?这更有效吗?我首先想到的是,制作JOIN需要进行交叉连接,然后过滤非常大的表,当进行多次单选时,您可以处理不再需要的数据,但这只是一个想法。
任何人都可以解释?提前谢谢!
答案 0 :(得分:8)
Django只获取您要求它获取的数据。您可以使用select_related()和prefetch_related()要求它使用JOIN获取单个查询中的所有数据。
引用文档:
select_related(*字段)
返回一个“跟随”的QuerySet 外键关系,选择其他相关对象数据 当它执行其查询时。这是一个性能助推器 导致单个更复杂的查询,但意味着以后使用 外键关系不需要数据库查询。
prefetch_related(*查找)
返回自动生成的QuerySet 在单个批次中检索每个指定的相关对象 查找。