有没有办法评估一个查询集,然后在它上面调用过滤器?在这个例子中我只想访问数据库一次
例子:
qs = Model.objects.all()
for element in array:
current = qs.filter(name=element)
有没有办法评估一个查询集,然后在它上面调用过滤器?在这个例子中我只想访问数据库一次
例子:
qs = Model.objects.all()
for element in array:
current = qs.filter(name=element)
这里的调用qs.filter()
会生成一个新的查询集,它与 / 无关qs
。
此外,根据doc,qs
并current
在某些操作之前保持未评估。
您可以在 Python 中进行过滤:
qs = Model.objects.all()
for element in array:
current = filter(lambda x: x.name==element, qs)
但是,如果您的查询集和数组很大,这是低效的。或者,您可以按元素对查询集进行分组:
from collections import defaultdict #
qs = Model.objects.all()
grouped = defaultdict(list)
for obj in qs:
grouped[obj.name].append(obj)
for element in array:
current = grouped[element]
如果array
仅包含一小部分name
值,则限制查询集可能是有意义的:
qs = Model.objects.filter(name__in=array)
如果您想通过一击数据库来构建查询,您将需要使用 Q 对象:
from django.db.models import Q
q = Q()
for element in array:
q &= Q(name=element)
qs = Model.objects.filter(q)