Django 计算queryset,然后对其调用筛选器
有没有一种方法可以评估queryset,然后对其调用筛选器?在本例中,我只需要access数据库一次 例如: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
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过滤、简化需求等等。。