[英]How to Get queryset not 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}
但我想要查詢集我該怎么做..感謝您的幫助
這就是聚合所做的:)
您可以將DecimalField
添加到Invoice
model,在每次保存之前匯總total_amount
。 我建議為此發出信號。
class YourAppConfig(AppConfig):
...
def ready(self):
from . import signals
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
object,相關的Invoice
object 將被重新計算。
之后QuerySet
將保持為QuerySet
並且每個 object 將始終具有 caclulated 字段。
而不是使用.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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.