【问题标题】:Django annotate sum on fk_setDjango 在 fk_set 上注释 sum
【发布时间】:2021-08-28 06:08:08
【问题描述】:

我正在尝试注释相关集中的字段总和:

我的模型:

class Report(models.Model):

class ReportCommissionPosition(models.Model):
    report = models.ForeignKey(Report)
    reservation = models.OneToOneField("reservations.Reservation")

class Reservation(models.Model):

class Payment(models.Model):
    amount = models.DecimalField(max_digits=10, decimal_places=2)
    reservation = models.ForeignKey('reservations.Reservation')
    PAYMENT_TYPES=(
        ('TRANS', 'TRANS'),
        ('SELL', 'SELL'),
    payment_accounting_type = models.CharField(max_length=50, choices=PAYMENT_TYPES)

我需要用两个字段注释report.reportcommissionposition_set的每个位置:

trans_amount - 付款会计类型 == 'SELL' 的所有付款的总和(通过预订 => 付款) sum_amount - 付款会计类型 == 'TRANSFER' 的所有付款的总和(通过预订 => 付款)

我试过了:

for position in commission_position:
    position.sell_pay = position.reservation.payment_set.filter(payment_accounting_type='SELL').aggregate(amount=Sum('amount'))['amount']

但这会为每个元素创建新的查询。

有什么想法吗?

【问题讨论】:

    标签: django django-models django-annotate


    【解决方案1】:

    您可以使用以下方式注释这些内容:

    myreport.reportcommissionposition_set.annotate(
        trans_amount=Sum(
            'reservation__payment__amount',
            filter=Q(reservation__payment__type='SELL')
        ),
        sum_amount=Sum(
            'reservation__payment__amount',
            filter=Q(reservation__payment__type='TRANS')
        )
    )

    myreport 的 ReportCommissionPosition 对象将有两个额外字段:.trans_amount 和 .sum_amount 分别是 SELL 和 TRANS 付款的总和。

    【讨论】:

    • 感谢 Willem 分享您的知识!你让我今天一整天都感觉很好!我真的很感激这个!任何有兴趣的人的优化说明:我已将 select_related('reservation') 添加到查询中,以减少数据库查询的数量
    猜你喜欢
    • 2020-01-18
    • 2021-10-23
    • 2019-10-27
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 2019-07-21
    • 2023-04-10
    • 2021-09-03
    相关资源
    最近更新 更多