簡體   English   中英

如何獲取查詢集而不是字典 django 聚合

[英]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 我建議為此發出信號。

應用程序.py
class YourAppConfig(AppConfig):
    ...

    def ready(self):
        from . import 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 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM