Джанго ОРМ и Хит БД - PullRequest
6 голосов
/ 13 мая 2011

Когда я делаю что-то вроде

I. objects = Model.objects.all()

, а затем

II. objects.filter(field_1=some_condition)

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

Ответы [ 3 ]

12 голосов
/ 13 мая 2011

На самом деле вы не попадете в базу данных, пока не оцените qs, запросы: lazy.

Подробнее here.

edit:

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

qs = SomeModel.objects.all()

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

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

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

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']
2 голосов
/ 13 мая 2011

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

1 голос
/ 13 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...