Django: агрегировать, если все булевы поля модели равны True
from django.db import models
class Car(models.model):
sold = models.BooleanField(default=False)
Я могу определить, были ли проданы все автомобили, сделав два запроса:
sold_count = Car.objects.filter(sold=True).count()
all_count = Car.objects.count()
are_all_sold = (all_count - sold_count) == 0
Поскольку эта операция очень часто встречается в моем приложении, мне интересно, возможно ли сделать это в одном запросе к БД? Например, используя Aggregation или Query Expressions и т.д.
Да. Вы можете сделать это с помощью Model Manager.
в model.py:
from django.db import models
class CarManager(models.Manager):
def are_all_sold_or_not(self):
sold_count = Car.objects.filter(sold=True).count()
all_count = Car.objects.count()
return all_count == sold_count
class Car(models.model):
sold = models.BooleanField(default=False)
objects = CarManager()
в файле views.py
def myview(request):
.....
.
are_all_sold = Car.objects.are_all_sold_or_not()
.
.
Подробнее о Model Manager вы можете прочитать в документации: https://docs.djangoproject.com/en/4.0/topics/db/managers/