2013-01-04 3 views
1

Требование должно иметь доступ к элементам оценивается QuerySet с помощью строкового атрибута, в данном случае name. Мне не нравится идея перебирать QuerySet, поскольку кажется, что есть более эффективный способ.Отфильтровать оцененный QuerySet в Django

После того как я назвал что-то вроде:

my_objects = MyObject.objects.all() 

И я оцениваю это что-то вроде:

len(my_objects) 

Что является лучшим способом, чтобы получить определенный результат по имени из оцениваемого QuerySet , в этом случае 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

Оценка запроса - это список. Нет индексации элементов списка, поэтому в любом случае требуется цикл. Но оцениваемый набор запросов считается не таким огромным, не более нескольких сотен записей, так что петля в порядке. Не оценивайте большие запросы.

Кстати, подобные списки объектов создаются prefetch_related(). Существует реализация ListQuerySet, которая поддерживает множество фильтров, порядок и четкие, что делает возможным запуск многие (не все, хотя) запросов таких списков объектов:

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