Django:存在()使用查询集缓存

Django: exists() using queryset cache

如果调用两次,django 的 QuerySet.exists() 方法是否使用查询集的缓存? 例如

# this makes a call to db
queryset.exists()
# > true

# does it make a call to the db or reuse some cached result?
queryset.exists()
# > true

我知道 len(queryset) 如果之前已经评估过数据库,则不会调用该数据库。和exists一样吗?

如果您使用 .exists() 两次,它将进行 两次 查询,查询集将 缓存结果.exists()呼唤。

如果您打算枚举查询集,则可以使用以下方法检查查询集的真实性:

if queryset:
    # not empty
    pass
else:
    # empty
    pass

这将进行查询并将记录加载到查询集的缓存中,因此稍后对查询集进行枚举、应用 len(…) 等将不会触发新的查询。

但是,如果您只对检查某个项目是否存在感兴趣,则应避免这种情况,出于同样的原因,如果您只对记录数感兴趣,则应使用 .count() [Django-doc] 而不是 len(…) : 通过使用 len(…) 记录 加载到内存中,这比进行 SELECT COUNT(*) 查询更昂贵。