为什么django模型会产生许多小问题而不是一个大问题?

时间:2016-02-04 11:13:48

标签: python django

很抱歉非特定问题,但我想这可能是一个有趣的问题。至少对我而言;)

我正在使用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需要进行交叉连接,然后过滤非常大的表,当进行多次单选时,您可以处理不再需要的数据,但这只是一个想法。

任何人都可以解释?提前谢谢!

1 个答案:

答案 0 :(得分:8)

Django只获取您要求它获取的数据。您可以使用select_related()prefetch_related()要求它使用JOIN获取单个查询中的所有数据。

引用文档:

  

select_related(*字段)

     

返回一个“跟随”的QuerySet   外键关系,选择其他相关对象数据   当它执行其查询时。这是一个性能助推器   导致单个更复杂的查询,但意味着以后使用   外键关系不需要数据库查询。

     

prefetch_related(*查找)

     

返回自动生成的QuerySet   在单个批次中检索每个指定的相关对象   查找。