Django оптимизирует сложный подсчет группировок

У меня есть следующие модели:

class Company(models.Model):
    ....
    cases = models.ManyToMany('Case')
    is_active = models.BooleanField(default=True)

class Case(models.Model):
    ....
    is_approved = models.BooleanField(default=False)
    product = models.ForeignKey('Product')

class Product(model.Model):
    ....

Я хочу получить все продукты (которые связаны с утвержденным делом), сгруппированные по активному статусу компаний. Таким образом, результат должен быть следующим:

{
    <Product: 1>: [12, 5], // 12 is the count of the active companies, and 5 is the non active companies
    <Product: 3>: [3, 4],
    <Product: 7>: [10, 2]
}

Я работал с приведенным ниже подходом, и он вернул правильный результат, но я хочу оптимизировать его.

companies = Company.objects.prefetch_related('cases').all()
products = {}
for i in companies:
    for c in i.cases.select_related('product').all():
        if c.is_approved == True:
            p = c.product
            if p not in products.keys():
                products[p] = [0, 0]
            if i.is_active == True:
                products[p][0] += 1
            elif i.is_active == False:
                products[p][0] += 2
Product.objects.annotate(active_compagnies=Count("case__compagny_set", filter=Q(is_approved=True, compagny_set__is_active=True), distinct=True), inactive_compagnies=Count("case__compagny_set", filter=Q(is_approved=True, compagny_set__is_active=False), distinct=True))

Это должно дать два числа, для того, чтобы узнать лучший способ получения массива, мне нужен более точный пример использования (если эти данные обслуживаются API, то может быть хорошей идеей решить массив во время сериализации)

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