2013-06-10 1 views
4

В соответствии с docs набор запросов оценивается при вызове на него списка()., добавляя запрос к списку/кортежу без его оценки

Есть ли способ добавить список/кортеж с набором запросов вместо объектов модели? Вызывается ли список() для каждой операции в списках/кортежах?

например:

foo= Foo.objects.all() 
bar = Bar.objects.filter(enabled=True) 

my_list = [] 

my_list.append(foo) <-- evaluates 
my_list.extend(foo) <-- evaluates 

my_tuple =() 
my_tuple = my_tuple + (foo,) <-- evaluates 

# so I'm getting 
[<Foo: ModelDescription>,<Foo: ModelDescription>,<Bar: ModelDescription>] 

#but I want 
[<Queryset: Foo>, <Queryset:Bar>] 
+1

Вы уверены, что первый и третий оцениваете запрос? Они не должны. –

+1

Я думаю, что они только оценивают в оболочке активного интерпретатора. – Jingo

+0

Да, они сделали. Помещение кода в функцию просмотра решило проблему :) – Jannis

ответ

0

Это либо уже не так или, может быть, как вы проверяли тип элементов был непреднамеренного срабатывания оценки.

Подводя итоги, вы можете использовать append() или my_tuple = my_tuple + (foo,). Если вы попробуете просто распечатать их, он будет оценивать QuerySet и выводить их содержимое, но если вы будете проходить через эти коллекции, вы можете работать с фактическим QuerySet.

>>> a = Author.objects.filter() 
>>> b = Book.objects.filter() 
>>> type(a), type(b) 
(<class 'django.db.models.query.QuerySet'>, <class 'django.db.models.query.QuerySet'>) 
>>> l = [] 
>>> l.append(a) 
>>> l.append(b) 
>>> type(l[0]), type(l[1]) 
(<class 'django.db.models.query.QuerySet'>, <class 'django.db.models.query.QuerySet'>) 
>>> for q in l: 
... print type(q) 
... 
<class 'django.db.models.query.QuerySet'> 
<class 'django.db.models.query.QuerySet'> 
>>> my_tuple =() 
>>> my_tuple = my_tuple + (a,) 
>>> type(my_tuple[0]) 
<class 'django.db.models.query.QuerySet'> 
>>> len(l) 
2 
>>> len(my_tuple) 
1 
>>> print l 
[[<Author: Author object>, '...(remaining elements truncated)...'], [<Book: Book object>,]] 
>>> len(my_tuple) 
1 
>>> print my_tuple 
([<Author: Author object>, '...(remaining elements truncated)...'],) 
>>> len(my_tuple) 
1 
>>> 
Смежные вопросы