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/

Вернуться на верх