Django аннотирует сумму на fk_set

Я пытаюсь аннотировать сумму полей в связанном наборе:

Мои модели:

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 - Сумма всех платежей с типом учета платежа == 'ПРОДАЖА' (через резервирование => платежа) sum_amount - Сумма всех платежей с типом учета платежа == 'ПЕРЕВОД' (через резервирование => платежа)

Я пробовал:

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

Но это создает новый запрос для каждого элемента.

Какие-нибудь мысли?

<
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 с суммами платежей SELL и TRANS соответственно.

Вернуться на верх