评估查询集,然后在其上调用过滤器

时间:2012-12-03 13:07:15

标签: django

有没有办法评估一个查询集然后调用它的过滤器?我想在这个例子中只访问一次数据库

示例:

qs = Model.objects.all()

for element in array:
  current = qs.filter(name=element)

3 个答案:

答案 0 :(得分:1)

此处的通话qs.filter()会生成一个新的查询集,与qs无关。 此外,根据the docqscurrent会在某些操作之前保持未评估状态。

答案 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)