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(*)
查询更昂贵。
如果调用两次,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(*)
查询更昂贵。