2011-05-13 2 views
5

Когда я делаю что-то вродеDjango ORM и нажав DB

I. objects = Model.objects.all()

, а затем

II. objects.filter(field_1=some_condition)

Я ударил db каждый раз, когда на шаге 2 с различными условиями. Есть ли способ получить все данные в первом действии, а затем просто позаботиться о результате?

ответ

9

Вы на самом деле не попадаете в db, пока не оцените qs, запросы lazy.

Подробнее here.

редактировать:

После перечитывания вашего вопроса становится очевидным, вы спрашивали, как предотвратить хиты дБ при фильтрации для различных условий.

qs = SomeModel.objects.all() 

qs1 = qs.filter(some_field='some_value') 
qs2 = qs.filter(some_field='some_other_value') 

Обычно вы хотите, чтобы база данных выполняла фильтрацию для вас.

Вы можете заставить оценку qs преобразовать ее в список. Это предотвратило бы дальнейшие удары db, однако, вероятно, это будет хуже, чем возврат ваших результатов в db.

qs_l = list(qs) 
qs1_l = [element for element in qs_l if element.some_field='some_value'] 
qs2_l = [element for element in qs_l if element.some_field='some_other_value'] 
+0

Спасибо, еще один вопрос. Могу ли я ударить db без преобразования QuerySet в список? Или, может быть, я могу преобразовать список обратно в QuerySet? – alexvassel

+0

Вы не можете преобразовать список в запрос. Вы можете ударить db несколькими способами, они перечислены во второй ссылке ответа DTing. – DrTyrsa

+0

Вы можете ударить по db способами, указанными в ссылке «Подробнее здесь», например. итерации, нарезки с разделами и т. д. Этот ответ http://stackoverflow.com/questions/1058135/django-convert-a-list-back-to-a-queryset/1058152#1058152 и связанный с ним вопрос могут представлять интерес для вы. – DTing

1

Почему бы вам просто не сделать objs = Model.objects.filter(field=condition)? Тем не менее, как только SQL-запрос выполняется, вы можете использовать выражения Python для дальнейшей фильтрации/обработки без дополнительных удалений базы данных.

2

Конечно, вы будете ударять db каждый раз. filter() преобразуется в оператор SQL, который выполняется вашим db, вы не можете filter, не ударяя его. Таким образом, вы можете получить все необходимые вам объекты с помощью values() или list(Model.objects.all()) и, как предложил zeekay, использовать выражения Python (например, списки) для дополнительной фильтрации.

+0

Это неправда. проверьте ссылки в ответе: http://stackoverflow.com/a/5989752/4213969 – Vladimir

Смежные вопросы