Django - Как вычесть две аннотации с разными моделями

a = Category.objects.annotate(total_products=Count('product'))
b=Order.objects.values('category__name').annotate(total_approve=Sum('approve_quantity')).order_by('-total_approve')

поэтому я хочу вычесть a - b

Вы можете аннотировать Categorys с помощью Subquery выражения [Django-doc]:

from django.db.models import Count, F, OuterRef, Subquery, Sum

Category.objects.annotate(
    total_products=Count('product'),
    total_approve=Subquery(
        Order.objects.filter(
            category=OuterRef('pk')
        ).values('category').annotate(
            total=Sum('approve_quantity')
        ).order_by('category').values('total')[:1]
    )
).annotate(
    difference=F('total_products')-F('total_approve')
)

Объекты Category, возникающие из этого кверисета, будут иметь дополнительный атрибут .difference, который будет содержать разницу между количеством связанных Products и суммой approved_quantitys для связанных Orders.

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