在一次技术面试中,提问者问了我一个关于查询集执行的奇怪问题。假设我们有一个像下面这样的配置文件模型:
class Profile(models.Model):
user = models.OneToOneField('User').select_related(User)
surname = models.TextField(null=True)
q = Profile.object.all()
or
q = Profile.object.get(id=1)
l = q.filter(active=True)
他问发生了多少查询执行,我回答说 python 解释器执行 Profile.object.all()
在乞讨时,一个查询已经完成。但是,他回答了零,如果我们调用查询,则回答为 1,如下所示:for a in l:
a.surname
他的回答在 Django 中是真的吗?另一个疑问是关于
models.OneToOneField('User')
,他为什么不用django.contrib.auth.models.User
并定义 models.OneToOneField('User').select_related(User)
最佳答案
QuerySets 不会被评估,直到你做一些真正需要它们被评估的事情。由于该类本身的文档说明了 QuerySet
:
Represent a lazy database lookup for a set of objects.
重点字懒惰 .这是因为人们经常需要在查询集上调用或链接方法,一个很好的例子是需要随后调用
.values()
的组。和 .annotate()
.如果直接评估查询集,那么我们将对数据库进行过多不需要的查询,从而减慢执行速度。至于何时准确评估查询集,我将简要列出答案(对于长答案,请参阅 When QuerySets are evaluated [Django docs] ):
repr()
, len()
, list()
, 或 bool()
在查询集上 get()
, first()
, last()
, latest()
, 或 earliest()
等也查询数据库关于python - 当 django 查询执行发生时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67003832/