【发布时间】:2020-07-21 17:20:54
【问题描述】:
如果我想以几种不同的方式计算数据库中的人数,将初始 People.objects.all() 分配给变量(以下版本 A)比每次查询它更有效吗?
Version A 是否会导致对 db 的一次命中,而 Version B 会导致两次?
版本 A:
people_var = People.objects.all()
last_name_filter = people_var.filter(last_name='Doe').count()
first_name_filter = people_var.filter(first_name='John').count()
版本 B:
last_name_filter = People.objects.filter(last_name='Doe').count()
first_name_filter = People.objects.filter(first_name='John').count()
【问题讨论】:
-
没有区别,两个版本都会命中数据库两次。请注意,
QuerySets 是惰性的,因此永远不会执行people_var,即使是,.filter(..)也会创建一个新的查询集。 -
如何才能更好地结构化?缓存初始查询,然后使用缓存?
-
好吧,你总是不能对同一个过滤器多次执行
count()。如果由于某种原因不知道last_name值相似或不同,您可以使用一个单独的函数,将last_name作为参数并将lru_cache装饰器应用于它,这样对于相同的last_name,缓存的结果将被返回。 -
您上面的代码可能有错误。在所有情况下,您都在查询
last_name。很确定这两个版本的第一个查询应该由first_name查询请在您的问题中解决这个问题,否则请指出当前过滤器是正确的,因为这会使问题不清楚且难以回答。 -
@rdik: 因为没有缓存,
People.objects.all()不会不进行查询。
标签: python django database sqlite