1

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

例子:

qs = Model.objects.all()

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

3 回答 3

2

这里的调用qs.filter()会生成一个新的查询集,它与 / 无关qs
此外,根据docqscurrent在某些操作之前保持未评估。

于 2012-12-03T13:18:15.900 回答
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)
于 2012-12-03T13:52:05.843 回答
0

如果您想通过一击数据库来构建查询,您将需要使用 Q 对象:

from django.db.models import Q
q = Q()
for element in array:
    q &= Q(name=element)
qs = Model.objects.filter(q)
于 2012-12-03T19:35:38.977 回答