我有一个"预期付款"表。要么是一次性付款,要么是每月、每季度或每年循环付款。目标是计算未来12个月每个月的预期付款总额。
模型如下:
class ExpectedPayment(models.Model):
id = models.BigIntegerField(primary_key=True)
period = models.BigIntegerField()
date_start = models.DateField(blank=True, null=True)
date_end = models.DateField(blank=True, null=True)
amount = models.DecimalField(max_digits=1000, decimal_places=1000)
周期1 =每月循环
周期2 =每季度-从开始日期开始。(所以从2月开始,下一季度是5月)
第3期=年度经常性-也遵循开始日期
第4期=一次性付款
我怎样才能正确计算总金额?每个月,在考虑何时付款的同时?尤其是季度付款…
我不知道当付款开始和结束时如何合并,因为它可能在一年的中途开始,3个月后结束,或者已经完成了。我怎么知道哪个月的季度应算作预期付款,当它总是相对于其start_date。
单个月的示例:(当前月的每月付款)
start_of_current_month = datetime.today().replace(day=1)
current_month_expected_monthly_payments = ExpectedPayment.objects.filter(period=1, date_start__lte=start_of_current_month, date_end__gte=start_of_current_month).aggregate(total=Sum("amount"))
假设每个给定期间的付款都是在期初收取的。例如—对于2月开始的季度付款,2月、3月和4月的金额将在2月收集。对于报表,您希望将金额报告为金额/3,因为您希望按月报告。这是我的想法对于每个期间,您可以使用注释-
计算金额。ExpectedPayment.objects.filter(
date_start__lte=start_of_current_month,
date_end__gte=start_of_current_month
).annotate(
monthly_amount = Case(
When(period=2, then=F('amount')/3,
When(period=3, then=F('amount')/12,
default=F('amount')
)).aggregate(monthly_sum = Sum(F('monthly_amount'))
由于您是按月报告金额,因此您不需要单独的月付款案例。对于一次性付款,如果交易发生在当月,金额将被考虑。因此,对于这些情况,不需要单独的情况。
我在这里引用了文档:
- 条件表达式
- 查询表达式
这里有一个使用注释和聚合的问题,我想你可能会发现它们很有用。