#ПРОПИТОН: Обнаружен аналог all([...]) в Django ORM 🐍В Django ORM
all()
возвращает QuerySet всех объектов. А значит — для проверки соответствия всех элементов какому-либо условию нужен другой метод. Если вы работаете в PostgreSQL, то можно применить функцию
BoolAnd
⚡️️Представим, что у нас есть какой-то материал для отгрузки, но мы можем отгрузить его только после полной оплаты. Сами понимаете... Тогда выполним следующие шаги:
1️⃣ Аннотируем поле
is_paid
. Оно покажет, оплачена ли каждая отгрузка.
partial_shipments = partial_shipments.annotate(
is_paid=Case(
When(
# Когда статус - "оплачено", то она оплачена
payment__payment_status=PaymentStatus.PAID,
then=True
),
# В любом другом статусе не оплачена
default=False,
)
)
2️⃣ Применяем
aggregate
для аггрегации данных вместе с
BoolAnd
:
all_paid = partial_shipments.aggregate(
# Все оплачено, если все отгрузки is_paid=True
all_partial_shipments_paid=BoolAnd("is_paid")
)["all_partial_shipments_paid"]
3️⃣ Если все отгрузки оплачены, то мы получаем
True
. Если хотя бы одна не оплачена —
False
.
Это очень полезная всем нам (и особенно — бизнесам) фича. Хотите познакомиться с похожими?
🔥 — хочу ещё!