Есть ли недостаток в использовании «.filter (). Filter (). Filter () ...» в Django? - PullRequest
7 голосов
/ 17 сентября 2010

Разрешены ли следующие два вызова в эквивалентном запросе SQL в Django?

Цепочка нескольких вызовов

Model.objects \
.filter(arg1=foo) \
.filter(arg2=bar) \
...

Объединение всех аргументов вместе:

Model.objects \
.filter(arg1=foo, arg2=bar)

Мне бы хотелось, чтобы код был читабельным (фильтров на много больше, чем я показал), но только в том случае, если нет потери в производительности.

Ответы [ 2 ]

11 голосов
/ 17 сентября 2010

Обновление:

Не обращайте внимания на этот ответ. Смотрите лучше, правильный ответ . Спасибо @ Сэм за хедз-ап.

Старый ответ:

Разрешены ли следующие два вызова в эквивалентном SQL-запросе в Django?

Краткий ответ: да. Они будут генерировать эквивалентные запросы.

Я проверил это с помощью модели, которую я использую. произведенные запросы функционально идентичны. Различные filter условия AND объединяются в запросе.

Я бы хотел, чтобы код был читабельным (количество фильтров гораздо больше, чем я показал), но только если нет потери в производительности.

Одним из способов достижения читабельности является использование словаря для сбора всех условий фильтрации. Например,

conditions = dict(arg1 = foo, arg2 = bar, ....)
conditions.update(argN = baz)

Model.objects.filter(**conditions)
6 голосов
/ 17 сентября 2010

В дополнение к ответу Маноя, вот как вы можете проанализировать sql, сгенерированный для объекта QuerySet:

result1 = SomeModel.objects.filter(field1=100, field2=200)
print "Result1", results1.query

result2 = SomeModel.objects.filter(field1=100).filter(field2=200)
print "Result2", result2.query
...