python - 当 django 查询执行发生时

标签 python django

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

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/

    相关文章:

    python - 所选行的值 > X 的列名称列表

    python - 如何使用 matplotlib 绘制大范围值?

    database - South 的回滚应该如何工作?

    python - 已删除InDjango19Warning - 不在 INSTALLED_APPS 中的应用程序中

    python - Django Rest Framework 自定义序列化器方法

    python - 使用 Python 子进程运行 npm 命令

    python - 你能在 Python 列表理解中嵌入一个 try 吗?

    python - 用列表切片张量 - TensorFlow

    python - 使用 Django 支持的站点和 SQLite 随着时间的推移以特定速率递增整数的最佳方法是什么?

    python - Django Crispy Forms 添加 HTML 属性