Как получить 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