Активация/деактивация фильтрации в django на основе условия
У меня есть bool
и если это True
, то я хочу отфильтровать в запросе по некоторым параметрам, если нет, то я не хочу фильтровать.
На данный момент мое решение таково:
if my_boolean:
objects = Class.objects.filter(argument=valuexyz)...
else:
objects = Class.objects...
Мой реальный запрос намного длиннее. Я просто использовал это для упрощения. Теперь я хочу спросить, можно ли сделать это в строке?
Нравится: objects = Class.objects.filter( if my_boolean: argument=valuexyz; else: no_filtering)
Есть ли способ сделать это как-то иначе? Это позволило бы мне сэкономить несколько лишних строк кода.
Ваш текущий метод быстр и читабелен, учитывая, что есть только один булев и только 2 возможных запроса. Я бы оставил все как есть. Тем не менее, если ваш реальный сценарий использования более сложен, вы можете использовать:
- Распаковка аргумента ключевого слова с помощью оператора
**
с операторомdict
:
my_filter = {
"field1": "foo"
"field2__gt": 10
}
if my_boolean:
my_filter["additional_field"] = "bar"
objects = MyModel.objects.filter(**my_filter)
my_q = Q(field1="foo", field2__gt=10)
if my_boolean:
my_q &= Q(additional_field="bar")
objects = MyModel.objects.filter(my_q)
Вы можете работать с объектом Q
, чтобы получить похожий синтаксис, например:
from django.db.models import Q
objects = Class.objects.filter(Q(('field__lookup', value) if condition else ()))
хотя, таким образом, она делает некоторую обертку. Возможно, лучший способ - сделать небольшую вспомогательную функцию:
def qif(*args, _if=True, **kwargs):
if _condition:
return Q(*args, **kwargs)
return Q()
и использовать:
objects = Class.objects.filter(qif(field__lookup=value, _if=condition))
Note: It might be worth to take a look at
django-filter
[GitHub] to do filtering based on aQueryDict
in a more declarative way.