django中的Prefetch_related和select_related函数
在Django中,select_related和prefetch_related被设计用来阻止因访问相关对象而导致的数据库查询的泛滥。在这篇文章中,我们将看到它是如何减少查询次数并使程序更快。
- select_related() “遵循 “外键关系,当它执行查询时选择额外的相关对象数据。
- prefetch_related()为每个关系做单独的查找,并在Python中做 “连接”。
当你要选择的对象是一个单一的对象时,就使用select_related,所以是OneToOneField或ForeignKey。当你要得到一个 “集合 “的东西时,你使用prefetch_related,所以像你说的ManyToManyFields或反向外键。澄清一下我说的 “反向外键 “是什么意思。
举例说明Prefetch_related和select_related的概念 –
上面的分类可能不是很清楚,让我们看一个例子。
select_related通过多表连接协会查询一次获得所有数据,并通过减少数据库查询次数提高性能。它使用SQL的JOIN语句,通过减少SQL查询的次数来优化和提高性能。后者是通过JOIN语句来解决SQL查询中的问题。但是,对于多对多的关系,使用SQL语句来解决是不明智的,因为通过JOIN得到的表会很长,这将导致SQL语句的运行时间和内存占用增加。解决prefetch_related()的方法是分别查询每个表,然后用Python来处理它们之间的关系!
这里有一些例子。
Models.py的内容如下。
select_related –
我们使用select_related()函数。
只有一个SQL查询,这显然大大减少了SQL查询的数量。
prefetch_related –
这里我们可以看到,Django使用了INNER JOIN。我想明确一点,Optimize是我们应用程序的一个名称。如果我们想得到湖北的所有城市名称,我们可以这样做。
触发的SQL查询。
我们可以看到,预取是使用IN语句实现的。这样,当QuerySet中有太多的对象时,根据数据库的特点,可能会出现性能问题。