- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在 Django 文档中,
select_related()
"follows" foreign-key relationships, selecting additional related-object data when it executes its query.
prefetch_related()
does a separate lookup for each relationship, and does the "joining" in Python.
“在python中加入”是什么意思?谁能举例说明一下?
我的理解是对于外键关系,使用select_related
;对于 M2M 关系,使用 prefetch_related
。这是正确的吗?
最佳答案
您的理解大部分是正确的。当您要选择的对象是单个对象时,您可以使用 select_related
,例如 OneToOneField
或 ForeignKey
。当您要获得一组“东西”时,您使用 prefetch_related
,因此如您所说的 ManyToManyField
或反向 ForeignKey
。只是为了澄清我所说的“反向 ForeignKey
s”的意思,这里有一个例子:
class ModelA(models.Model):
pass
class ModelB(models.Model):
a = ForeignKey(ModelA)
ModelB.objects.select_related('a').all() # Forward ForeignKey relationship
ModelA.objects.prefetch_related('modelb_set').all() # Reverse ForeignKey relationship
不同之处在于 select_related
执行 SQL 连接,因此从 SQL 服务器获取结果作为表的一部分。另一方面,prefetch_related
执行另一个查询,因此减少了原始对象中的冗余列(上例中的 ModelA
)。您可以将 prefetch_related
用于您可以使用 select_related
的任何内容。
权衡是 prefetch_related
必须创建一个 ID 列表并将其发送回服务器,这可能需要一段时间。我不确定在事务中是否有这样做的好方法,但我的理解是 Django 总是只发送一个列表并说 SELECT ... WHERE pk IN (...,...,...)基本上。在这种情况下,如果预取的数据是稀疏的(假设美国国家对象链接到人们的地址),这可能非常好,但是如果它更接近一对一,这可能会浪费大量通信。如有疑问,请尝试两者,看看哪个效果更好。
上面讨论的一切基本上都是关于与数据库的通信。然而,在 Python 方面,prefetch_related
具有额外的好处,即使用单个对象来表示数据库中的每个对象。 select_related
将在 Python 中为每个“父”对象创建重复对象。由于 Python 中的对象有相当多的内存开销,这也是一个考虑因素。
关于python - Django ORM 中的 select_related 和 prefetch_related 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31237042/
我很抱歉这个新手问题。我试图找出 select_related() 和 select_related('ColumnName') 之间的区别。这两者有区别吗? 我正在努力理解 this post其中作
我有两个模型与我无法控制的数据库一起使用。两者都设置为 managed = False .第一个模型有一个字段,它是第二个模型的外键,但它实现为 CharField ,而不是 ForeignKey .
我有以下示例: class Profile(models.Model): ... class Person(models.Model): profile = models.Foreig
我是 Django 和数据库的新手,所以我试图对性能有所了解。具体来说,我想了解 select_related()正在按照我认为的方式工作。 这是我的模型的简化版本: class User(model
我在尝试通过多个 OneToOneField 关系进行 select_related 时遇到一个奇怪的错误,例如在目标字段是孙子类的情况下。我希望有人帮助我了解发生了什么(或确认这是 Django 中
我正在尝试在 Django 中优化我的 ORM 查询。我使用 connection.queries 查看 django 为我生成的查询。 假设我有这些模型: class Book(models.Mod
当使用select_lated时,有没有人开发出一种方法来过滤外键表中的字段。 例如给定这些模型: class Author(models.Model): first_name = model
我在 Django 中有两个模型。第一个是什么工作职能(职位)向哪些其他职位报告的层次结构,第二个是人员及其担任的工作职能。 class PositionHierarchy(model.Model):
有时在 django 模板中使用 select_related 是有意义的。例如,假设我有一个扩展 DetailView 的类 class DemoCarView(DetailView): m
我有两个简单的模型:用户(标准 Django 用户)和类 Post (models.Model): class Post (models.Model): name = models.CharFi
entry_set 是否应该与 select_related 一起缓存?即使在我使用 select_related 之后,我的数据库仍然接到电话。相关部分 class Alias(models.Mod
如果我有以下模型: class Contact(models.Model) name = models.CharField(max_length=100) ... class Cont
我有以下模型。 class Car(models.Model): owner = models.ForeignKey('Driver') class Country(models.Model)
我为查询集中的每个对象选择了一个相关对象。如何为每个值注释计算值? 模型: class School(models.Model): name = models.CharField(max_le
我用 related_name='children' 在 Child 模型中创建了一个 OneToOneField(parent) .在我看来,我使用了 select_related获取查询集。但是在
我有一个类似于下面的多表继承架构: class NodeData(models.Model): node = models.ForeignKey(Node, db_index = True)
我正在做一个 select_related() 查询集来防止不必要地命中数据库。在我的模型中,我有: class Item(models.Model) user = models.Foreig
我有两个模型:工作和位置: class Job(models.Model): title = models.CharField(max_length=20) company = model
我的模型如下相关(Milestone 和 Ticket) class Ticket(models.Model): create_date = models.DateTimeField('date
我有以下两个模型: class StraightredFixture(models.Model): fixtureid = models.IntegerField(primary_key=Tr
我是一名优秀的程序员,十分优秀!