Как получить queryset, а не dict django aggregate

я использую этот набор запросов для своих требований

invoices = Invoice.objects.aggregate(total_amount=Sum('order__order_items__amount'),number_of_invoices=Count('pk', distinct=True))

что возвращает dict--->

{'total_amount': Decimal('17700.00'), 'number_of_invoices': 2}

но я хочу queryset, как я могу это сделать? Спасибо за любую помощь

Вот что делают агрегаты :)

Вы можете добавить DecimalField к Invoice модели, которая агрегирует total_amount во время перед каждым сохранением. Я предлагаю сигналы для этого.

apps.py
class YourAppConfig(AppConfig):
    ...

    def ready(self):
        from . import signals
signals.py
from django.db.models.signals import pre_save
from django.dispatch import receiver

from .models import Invoice

@receiver(pre_save, sender=Invoice)
def total_amount_aggregation(sender, instance, *args, **kwargs):
    instance.total_amount = # aggregate desired amount here

Вы должны установить аналогичные сигналы для ваших Order, поэтому если вы измените Order объект, связанный Invoice объект будет пересчитан.

После этого QuerySet останется как QuerySet и каждый объект будет иметь всегда каккулированное поле.

Вместо использования .aggregate(...) используйте .annotate(...) это вернет QuerySet с заданным выражением

from django.db.models import Sum, Count

invoices = Invoice.objects.annotate(
            total_amount=Sum('order__order_items__amount'),
            number_of_invoices=Count('pk', distinct=True)
           )

тогда для получения Sum(...) & Count(...) поля тогда сделайте так invoices[0].total_amount__sum & invoices[0].number_of_invoices__count

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