有没有办法评估一个查询集然后调用它的过滤器?我想在这个例子中只访问一次数据库
示例:
qs = Model.objects.all()
for element in array:
current = qs.filter(name=element)
答案 0 :(得分:1)
此处的通话qs.filter()
会生成一个新的查询集,与qs
无关。
此外,根据the doc,qs
和current
会在某些操作之前保持未评估状态。
答案 1 :(得分:1)
您可以在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)
答案 2 :(得分:0)
如果您希望通过一次命中数据库来构建查询,则需要使用Q对象:
from django.db.models import Q
q = Q()
for element in array:
q &= Q(name=element)
qs = Model.objects.filter(q)