0

我有一个查询集: -Django的查询集过滤性能

queryset = my_object.someobject_set.all() 

从那里开始,我想从查询集进行过滤。即:

print queryset.filter(name='some1').exists() 
print queryset.filter(name='some2').exists() 
print queryset.filter(name='some3').exists() 

但是对于每个筛选查询,都有一个数据库再次命中。我如何缓存查询集,然后从中过滤?

我甚至尝试做这个筛选之前评估查询集: -

print len(queryset) 

但是,这是行不通的。 任何帮助?

+0

或者你的意思是这是3个不同的查询? –

+0

是的我的意思是3个不同的查询 –

+0

然后修复你的代码 –

回答

2

这是不可能与Django的ORM。但你可以在Python中做到这一点。

queryset = list(my_object.someobject_set.all()) 

print list(filter(lambda i: i.name == 'some1', queryset)) 
print list(filter(lambda i: i.name == 'some2', queryset)) 
print list(filter(lambda i: i.name == 'some3', queryset)) 

这样你就不会做任何额外的数据库点击。但是,如果这个查询集真的比使用ORM更好,即使它碰到db。时间为自己,看看哪一个更快

+1

无需将所有列存入内存。使用'only'来代替。 – itzMEonTV

+0

@itzmeontv我不确定他只是想检查值是否存在。但是,是的,如果这只需要检查'唯一'是要走的路。 –

+0

你怎么想的?循环遍历列表并检查字段与'存在'查询db?从你的知识中回答? :) – itzMEonTV