Python 通过优化Django中的_集减少查询

Python 通过优化Django中的_集减少查询,python,django,Python,Django,下面的结果为4 db点击。因为第3行和第4行只是过滤我在第2行中获取的内容,所以我需要做哪些更改,以使其不会再次命中数据库 page = get_object_or_404(Page, url__iexact = page_url) installed_modules = page.module_set.all() navigation_links = installed_modules.filter(module_type=ModuleTypeCode.MODAL) module_map =

下面的结果为4 db点击。因为第3行和第4行只是过滤我在第2行中获取的内容,所以我需要做哪些更改,以使其不会再次命中数据库

page = get_object_or_404(Page, url__iexact = page_url)
installed_modules = page.module_set.all()
navigation_links = installed_modules.filter(module_type=ModuleTypeCode.MODAL)
module_map = dict([(m.module_static_object.key, m) for m in installed_modules])

这是一种过早优化的情况。对于页面加载的4db查询是不错的。我们的想法是使用尽可能少的查询,但您永远不会在每个场景中都将其降到1。在不必要地创建查询方面,您拥有的代码似乎并不离谱,因此很可能它已经尽可能地优化了。

这是一种过早优化的情况。对于页面加载的4db查询是不错的。我们的想法是使用尽可能少的查询,但您永远不会在每个场景中都将其降到1。在不必要地创建查询方面,您那里的代码似乎并不离谱,因此很有可能它已经尽您所能进行了优化。

Django,因此以下行不会影响数据库:

installed_modules = page.module_set.all()
在您遍历此行中的查询集之前,不会执行查询:

module_map = dict([(m.module_static_object.key, m) for m in installed_modules])
因此,您发布的代码在我看来只命中了3个数据库查询,而不是4个

由于您已经从数据库中获取了所有模块,因此可以使用列表理解而不是其他查询来筛选导航链接:

navigation_links = [m for m in installed_modules if m.module_type == ModuleTypeCode.MODAL]
您必须进行一些基准测试,看看这是否提高了性能。在我看来,这可能是过早的优化

在获取
module\u static\u object.key
的每个模块中,您可能要执行一次数据库查询。在本例中,您可以使用.

Django,因此以下行不会命中数据库:

installed_modules = page.module_set.all()
在您遍历此行中的查询集之前,不会执行查询:

module_map = dict([(m.module_static_object.key, m) for m in installed_modules])
因此,您发布的代码在我看来只命中了3个数据库查询,而不是4个

由于您已经从数据库中获取了所有模块,因此可以使用列表理解而不是其他查询来筛选导航链接:

navigation_links = [m for m in installed_modules if m.module_type == ModuleTypeCode.MODAL]
您必须进行一些基准测试,看看这是否提高了性能。在我看来,这可能是过早的优化


在获取
module\u static\u object.key
的每个模块中,您可能要执行一次数据库查询。在这种情况下,您可以使用。

为什么
已安装的\u modules=
包含
.all()
方法?此外,你为什么要编字典?这个集合还会发生什么?@S.Lott这是一个更大功能的一部分。不管接下来会发生什么,我只是试图优化这些线路,这样我就不会超过两次点击db。一次抓取页面对象,然后一次抓取该页面的相关模块。然后我可以使用相关的集合来构建dict等等。。。我使用all获取与此页面相关的所有模块。但是如果没有必要,我会删除它。关于
navigation\u links=installed\u modules.filter(module\u type=ModuleTypeCode.MODAL)呢?选择相关('module\u static\u object\u key')
@布伦丹:(1)请通过更新问题来添加信息,使其成为一个连贯的整体。(2) “但如果没有必要,我会把它移走。”。您应该尝试删除
.all()
,看看会发生什么。(3) 创建词典似乎仍然是不必要的。请更新问题以解释为什么要生成词典。为什么
已安装的\u modules=
包含
.all()
方法?此外,你为什么要编字典?这个集合还会发生什么?@S.Lott这是一个更大功能的一部分。不管接下来会发生什么,我只是试图优化这些线路,这样我就不会超过两次点击db。一次抓取页面对象,然后一次抓取该页面的相关模块。然后我可以使用相关的集合来构建dict等等。。。我使用all获取与此页面相关的所有模块。但是如果没有必要,我会删除它。关于
navigation\u links=installed\u modules.filter(module\u type=ModuleTypeCode.MODAL)呢?选择相关('module\u static\u object\u key')
@布伦丹:(1)请通过更新问题来添加信息,使其成为一个连贯的整体。(2) “但如果没有必要,我会把它移走。”。您应该尝试删除
.all()
,看看会发生什么。(3) 创建词典似乎仍然是不必要的。请更新问题以解释为什么要建立词典。您如何知道查询的费用有多高?他问的问题是合理的。克里斯-这是一个相当长的函数的开始。当我查看函数中的所有查询时,我认为这是我可以保存最多的地方。这就是我试图优化的原因。好吧,关键是这里没有任何真正的节约。获取初始页面对象是对其自身的查询。获取已安装的模块是另一个查询。获取
导航\u链接
必然是另一个查询(即使它是基于
已安装的\u模块
的查询构建的),除非您执行类似于从已安装的\u模块创建列表的操作。这将保存一个查询,但留给您的是一个静态列表,而不是查询集。最多只保存一个查询,考虑到失去的功能,这在grand scheme中几乎毫无意义。您如何知道查询有多昂贵?他问的问题是合理的。克里斯-这是一个相当长的函数的开始。当我查看函数中的所有查询时,我认为这是我可以保存最多的地方。这就是我试图优化的原因。好吧,关键是这里没有任何真正的节约。获取初始页面对象是对其自身的查询。获取已安装的模块是另一个查询。获取
导航\u链接
必然是另一个查询(即使它是基于
已安装的\u模块
的查询构建的),除非您执行类似于从已安装模块创建列表的操作_