django - 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']
但这会为每个元素创建新的查询。
有什么想法吗?
解决方案
您可以使用以下方法注释这些:
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
推荐阅读
- java - Vaadin:过滤器的菊花链?
- angular - docker化我的角度应用程序时如何保持实时重新加载
- javascript - 如何在单击一次按钮时触发两个功能
- algorithm - 有人能解释一下为什么双端队列用于滑动窗口算法吗?
- php - laravel join 和 where 条件在两个带有分页的表上
- node.js - 如果没有结果,猫鼬会忽略 findOne 上的回调
- r - 从多列中包含变量的杂乱数据创建新变量
- azure-devops - Azure Devops - 计划代理更新
- c# - 如何使用 C# 在 Outlook 中将当前用户电子邮件地址转换为字符串?
- regex - sed 字符类,[:alpha:] 似乎匹配一个数字