gpt4 book ai didi

python - 当 django 查询执行发生时

转载 作者:行者123 更新时间:2023-12-03 23:39:14 25 4
gpt4 key购买 nike

在一次技术面试中,提问者问了我一个关于查询集执行的奇怪问题。假设我们有一个像下面这样的配置文件模型:

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] ):
  • 迭代查询集
  • 切片查询集(使用 step 参数)
  • 酸洗/缓存查询集
  • 调用 repr() , len() , list() , 或 bool()在查询集上
  • 各种方法,如 get() , first() , last() , latest() , 或 earliest()等也查询数据库
  • 关于python - 当 django 查询执行发生时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67003832/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com