2013-01-04 60 views
1

需求是我可以通过字符串属性访问 QuerySet的成员,在这种情况下为name。我不喜欢循环查询集的想法,因为它似乎有一种更有效的方式。在Django中筛选评估的QuerySet

我叫像后:

my_objects = MyObject.objects.all() 

而且我喜欢的东西评价它:

len(my_objects) 

什么是按名称从评估查询集获得特定结果的最佳方式,在这种情况下my_objects?理想情况下,我想看到类似my_objects.filter(foo='bar')

注意在进程过程中,我需要评估的QuerySet中的所有结果,所以这就是为什么我在一个初始查询中使用它。

回答

2

没有直接的方法来根据queryset中的字段值获取对象。但是你可以做的一件事就是从查询集创建一个字典,并设置name为重点(必须是唯一的):

my_objects = MyObject.objects.all() 
obj_dict = {obj.name: obj for obj in my_objects} 
print obj_dict['any_name'] 

FYI:如果你只想检索表中的单个对象,那么你可以使用.get方法:

obj = MyObject.objects.get(pk=id) 
or 
obj = MyObject.objects.get(name='unique_name') 
0

评估的queryset是一个列表。没有列表元素的索引,因此无论如何都需要循环。但评估的查询集被认为不是那么庞大,最多只有几百个条目,所以循环是可以的。不要评估大型查询集。

顺便提一下,类似的对象列表由prefetch_related()创建。还有,支持多种过滤器,排序和层次分明,使得可以运行许多(不是全部虽然)查询为对象的这类名单的ListQuerySet实现:

https://github.com/Dmitri-Sintsov/django-jinja-knockout/blob/master/django_jinja_knockout/query.py