Django 使用select_related()是否有益?
在Django中,有以下示例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
>>> 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)