Django 使用select_related()是否有益?

Django 使用select_related()是否有益?,django,django-models,Django,Django Models,在Django中,有以下示例 >>> b = Blog.objects.get(pk=1) # Update all the headlines belonging to this Blog. >>> Entry.objects.select_related().filter(blog=b).update(headline='Everything is the same') 该示例基于以下模型定义 from django.db import models

在Django中,有以下示例

>>> b = Blog.objects.get(pk=1)

# Update all the headlines belonging to this Blog.
>>> Entry.objects.select_related().filter(blog=b).update(headline='Everything is the same')
该示例基于以下模型定义

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField()

    def __str__(self):
        return self.name

class Entry(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    authors = models.ManyToManyField(Author)
    number_of_comments = models.IntegerField()
    number_of_pingbacks = models.IntegerField()
    rating = models.IntegerField()

    def __str__(self):
        return self.headline
Entry.objects.select\u related().filter(blog=b.update)(headline='一切都一样')行中使用
select\u related()
有什么好处 ?

在update语句中使用
select\u related()
没有任何好处。事实上,我认为
Entry.objects.filter(blog=b).update(headline='Everything is same')
的性能更好,因为它不执行不必要的内部联接,也不填充不必要的blog对象

你觉得怎么样

在update语句中使用
select\u related()
没有任何好处

的确。与此无关。这只意味着当您检索数据时,它将已经检索相关对象,并将这些列包装在通过
ForeignKey
访问的对象中。因此,这是一种避免N+1问题的机制

但对于过滤、注释等,Django将构造一个查询,在使用时与必要的表进行连接。因此,这里可以省略
。选择相关(…)
。Django ORM通常会忽略这一点,因为对带有
JOIN
s的查询执行
UPDATE
,通常会在数据库级别引发异常,因此不再清楚如何更新该异常

很可能这是来自的复制粘贴,我们看到:


更新:我为此创建了一个过滤器,并在编号中进行了修复。
。select_related
无关。过滤器(..)
ing。这只意味着当您检索数据时,它将已经检索到相关对象,但是过滤、注释等都将在使用时与必要的表连接。我为此创建了一个Django票证:更新:他们修复了文档:可能将在下一版本中。
>>> e = Entry.objects.select_related().get(id=2)