- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个要优化的 Django View 。它在页面上显示父对象及其子对象的列表。子模型将外键返回给父模型,因此 select_related
似乎不适用。
class Parent(models.Model):
name = models.CharField(max_length=31)
class Child(models.Model):
name = models.CharField(max_length=31)
parent = models.ForeignKey(Parent)
天真的实现使用 n+1 查询,其中 n 是父对象的数量,即。一个查询获取父列表,然后一个查询获取每个父列表的子列表。
我写了一个 View ,它在两个查询中完成这项工作 - 一个用于获取父对象,另一个用于获取相关的子对象,然后是一些 Python(我太尴尬了,无法在此处发布)来完成所有这些工作再次聚在一起。
一旦我发现自己导入了标准库的 collections
模块,我就意识到我可能做错了。可能有更简单的方法,但我缺乏找到它的 Django 经验。任何指针将不胜感激!
最佳答案
添加 related_name
到外键,然后使用 prefetch_related
添加到 Django 1.4 的方法:
Returns a
QuerySet
that will automatically retrieve, in a single batch, related objects for each of the specified lookups.This has a similar purpose to
select_related
, in that both are designed to stop the deluge of database queries that is caused by accessing related objects, but the strategy is quite different:
select_related
works by creating a SQL join and including the fields of the related object in theSELECT
statement. For this reason,select_related
gets the related objects in the same database query. However, to avoid the much larger result set that would result from joining across a 'many' relationship,select_related
is limited to single-valued relationships - foreign key and one-to-one.
prefetch_related
, on the other hand, does a separate lookup for each relationship, and does the 'joining' in Python. This allows it to prefetch many-to-many and many-to-one objects, which cannot be done usingselect_related
, in addition to the foreign key and one-to-one relationships that are supported byselect_related
. It also supports prefetching ofGenericRelation
andGenericForeignKey
.
class Parent(models.Model):
name = models.CharField(max_length=31)
class Child(models.Model):
name = models.CharField(max_length=31)
parent = models.ForeignKey(Parent, related_name='children')
>>> Parent.objects.all().prefetch_related('children')
所有相关的 child 都将在一个查询中获取,并使用使查询集具有相关的预填充缓存结果。然后在 self.children.all()
中使用这些 QuerySet电话。
Note 1 that, as always with QuerySets, any subsequent chained methods which imply a different database query will ignore previously cached results, and retrieve data using a fresh database query.
Note 2 that if you use
iterator()
to run the query,prefetch_related()
calls will be ignored since these two optimizations do not make sense together.
关于python - 查询较少的父对象及其子对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12814066/
我正在使用Visual Studio 2012和Web Essential 2012,而Less生成的css与预期的不一样 //style.less .selector{ max-heig
我创建了一个基于LESS的小型混合器,用于以标准或视网膜格式输出图像。我无法理解将变量包装在与此相伴的一些CSS URL中-当我编译下面的代码时,我最终得到 url('http://sample.co
有人可以帮助我使用 CSS(less)吗,因为我似乎还不能理解它是如何工作的,我已经通过 node.js 安装了它,但现在如何将它链接到我的代码/网页? 由于某种原因,选择框没有输出到网页上,因为很可
我知道大多数算术运算只能使用按位运算符( Add two integers using only bitwise operators? 、 Multiplication of two integers
我需要在 less 中选择一个类的第 n 个子元素,而不是计算特定类的元素。例如,给定: 李 li class="skip_this" 李 李 李 我想让第 n 个 child 在计数时跳过 skip
当我单击一个按钮时,我进行了一个 ajax 调用,该调用将不同的 html 代码加载到一个 ID 为“main”的 div 中。我可以毫无问题地显示 html 代码,但我找不到将 css 和 js 代
我正在使用非常有限的 Shell 开发嵌入式 Linux。内置命令非常少。 我想检查 gpio 端口。这适用于以下内容。但它需要很多 CPU/IO - 电源!!所以我想像 sleep 一样得到短暂的休
我是一名优秀的程序员,十分优秀!