Django Querset Aggregate на boolean Or

В документации Django queryset выполняется следующая агрегатная операция:

Book.objects.all().aggregate(Avg('price'))

Мне интересно, есть ли способ сделать что-то подобное, но с операцией or. Вместо того, чтобы брать среднее значение по полю с числами, можно было бы взять или из всех булевых значений для данного атрибута

Ну, вы могли бы подумать о логике вашего оператора. Вы хотите иметь оператор OR на столбце кверисета. Это означает, что ваш "оператор" будет возвращать True, если в любой из строк этот столбец равен True, и False в другом случае (False, если все они False).

Это можно легко реализовать следующим образом:

test_bool = bool(MyModel.objects.filter(my_bool_col=True))

Это происходит потому, что пустой кверисет оценивается как False, в любом случае как True.

Это эквивалентно any() в Python.

Чтобы сделать то же самое с AND, вы можете сделать противоположное: если любое из них ложно, то все условие ложно, так:

test_bool = not bool(MyModel.objects.filter(my_bool_col=False))

Я бы использовал для этого следующий фрагмент.

bestseller_found = Book.objects.filter(is_bestseller=True).exists()

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

unofficial_book_found = Book.objects.filter(isbn__isnull=True).exists()
Вернуться на верх