Python Django:处理定期付款时客户和付款的推荐模型定义

Python Django:处理定期付款时客户和付款的推荐模型定义,python,django,Python,Django,假设我有两个模型,一个用于客户,另一个用于付款。每个月我的客户应在每月15日之前付款。为了轻松获得当月未付款客户的报告,构建模型的最佳方法是什么 客户模式: class CustomerModel(models.Model): first_name = models.TextField() last_name = models.TextField() email = models.EmailField() 付款模式: class Payment(models.Model

假设我有两个模型,一个用于
客户
,另一个用于
付款
。每个月我的
客户
应在每月15日之前付款。为了轻松获得当月未付款客户的报告,构建模型的最佳方法是什么

客户模式:

class CustomerModel(models.Model):
    first_name = models.TextField()
    last_name = models.TextField()
    email = models.EmailField()
付款模式:

class Payment(models.Model):
    customer = models.ForeignKey(
               Customer,
               on_delete=models.SET_NULL,
               null=True) 
    amount = models.FloatField()
    date_received = models.DateField(auto_now=False)

我们可以在这里使用
.exclude(…)
来排除已付款的人,例如:

from datetime import date
month_day = date.today()            # specify a day in the month to check
from_date=month_day.replace(day=1)  # the first of the current month
to_date=month_day.replace(day=15)   # the 15th of the current month

Customer.objects.exclude(
    payment__date_received__gte=from_date
    payment__date_received__lte=to_date
)
或更优雅的
\u范围
查找:

Customer.objects.exclude(
    payment__date_received__range=(from_date, to_date)
)
如果我们今天运行此操作(月日等于2018年10月15日),我们将获得所有在10月1日至10月15日期间未进行付款的客户。这个月的任何一天都会发生同样的事情。通过将
month\u day
设置为例如
date(2017,12)
,您可以获得2017年12月1日至2017年12月15日期间未付款的所有客户


请注意,可能不是所有客户都在那一刻开始使用您的服务(或者已经取消订阅)。在这种情况下,这些
Customer
s将因此被列出,因此可能需要进行一些重构以使其更可用。

假设现在是10月12日,那么大多数
Customer
s将不会支付该月的费用,我们是否应该“列出”这些?“金额”在这里起作用了吗(如果是零,或者是负数呢)?你怎么知道付款的月份?如果有人在10月2日付款怎么办?他是上个月的还是这个月的?你到底有什么问题?