【问题标题】:Django ORM apply .filter() to an existing querysetDjango ORM 将 .filter() 应用于现有的查询集
【发布时间】:2022-01-22 16:31:09
【问题描述】:

我对要在这段代码 sn-p 中执行的数据库请求感到有点困惑

>>> from core.models import People
>>> p = People.objects.all()
>>> p.filter(age__gt=10) 

很明显,将objects.all() 传递给ORM 会导致一个像SELECT * 这样的请求

但是,如果我将.filter() 方法应用于现有查询集,是否会导致对数据库的第二次请求? 还是 ORM 会浏览现有的查询集?

谢谢

【问题讨论】:

标签: django django-models django-orm


【解决方案1】:

但是,如果我将.filter() 方法应用于现有查询集,是否会导致对数据库的第二次请求?

构造查询集不会进行数据库查询。确实,这里的p = People.objects.all()不会进行查询。

如果您“使用”查询集,查询集将进行查询。如果您遍历查询集,则使用查询集,调用 len(…)str(…)repr(…) 等等。

因此,这意味着如果您打印 p.filter(age__gt=10),它将使用 SELECT people.* FROM people WHERE age > 10 进行查询。如果您稍后打印p,它将进行第二次查询SELECT people.* FROM people

查询集在使用时也会缓存结果。因此,如果您对同一个 QuerySet 进行第二次迭代,它将重用上一个查询的结果。

【讨论】:

  • 你能告诉我如果我“消费”一个已经存储了查询集的变量,django 会做一个额外的查询吗?我的意思是 len(p) 在我的例子中。我认为只有 len(People.objects.all()) 会运行查询
  • @fghfgg: len(p) 将使用查询,但如果您已经枚举了查询,它将因此重用结果缓存,而不是进行第二次查询。
  • @fghfgg:根据经验,如果您需要查询集中的数据,它将进行查询,如果已经有数据,则不会进行第二次请求。
猜你喜欢
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2012-03-28
  • 2013-11-07
  • 2010-11-01
相关资源
最近更新 更多