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

Paw*_*pel 3 python django

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

我正在使用django模型一次从几个相关表中获取数据.当QuerySet得到支持时,我宁愿期望django像这样进行查询:

SELECT t1.field1, t1.field2, t2.field1, t2.field2 FROM t1
JOIN t2 ON (t1.fk_t2 = t2.pk);
Run Code Online (Sandbox Code Playgroud)

但不是我所想到的,我可以看到Django做这样的事情:

SELECT t1.field1, t1.field2, t1.fk_t2 FROM t1;
Run Code Online (Sandbox Code Playgroud)

然后为所有t1.fk_t2

SELECT t2.field1, t2.field2 FROM t2 WHERE id = (here comes some single id);
Run Code Online (Sandbox Code Playgroud)

这是默认的Django行为吗?为什么会这样?这更有效吗?我首先想到的是,制作JOIN需要进行交叉连接,然后过滤非常大的表,当进行多次单选时,您可以处理的数据不是真正需要的,但这只是一个想法.

谁能解释一下?提前致谢!

Muh*_*hir 8

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

引用文档:

select_related(*字段)

返回一个QuerySet,它将"跟随"外键关系,在执行查询时选择其他相关对象数据.这是一个性能增强器,它会导致单个更复杂的查询,但意味着以后使用外键关系不需要数据库查询.

prefetch_related(*查找)

返回一个QuerySet,它将在一个批处理中自动检索每个指定查找的相关对象.