首页 > 解决方案 > Django 在 fk_set 上注释 sum

问题描述

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

我的模型:

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']

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

有什么想法吗?

标签: djangodjango-modelsdjango-annotate

解决方案


您可以使用以下方法注释这些:

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')
    )
)

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


推荐阅读