Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 计算queryset,然后对其调用筛选器_Django - Fatal编程技术网

Django 计算queryset,然后对其调用筛选器

Django 计算queryset,然后对其调用筛选器,django,Django,有没有一种方法可以评估queryset,然后对其调用筛选器?在本例中,我只需要access数据库一次 例如: qs = Model.objects.all() for element in array: current = qs.filter(name=element) 这里的调用qs.filter()生成一个新的查询集,它与w/qs无关 另外,根据,qs和current在某些操作之前保持未计算状态。您可以在Python中进行筛选: qs = Model.objects.all() f

有没有一种方法可以评估queryset,然后对其调用筛选器?在本例中,我只需要access数据库一次

例如:

qs = Model.objects.all()

for element in array:
  current = qs.filter(name=element)
这里的调用
qs.filter()
生成一个新的查询集,它与w/
qs
无关

另外,根据,
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]
如果
数组
仅包含
名称
值的一小部分,则限制查询集可能有意义:

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)

若您将在forloop中执行一些操作,那个么您将拥有和数组中的元素一样多的查询。如何避免这种情况?@szaman啊,我明白你的意思。没有简单的方法可以做到这一点,因为一个查询集直接映射到一个sql。@szaman对于ORM优化,这取决于您的使用情况,您可以预取、缓存、用Python过滤、简化需求等等。。