在django中自动更改日期字段

时间:2017-08-28 16:58:51

标签: django django-models

我有2个日期字段,我想自动更新日期 当你阅读我的代码时,你会更加了解。 代码将无法工作,直到我自己更新更新的字段 如何让它自动更新(更新的字段)

STATUS_CHOICES = (
('P', 'Paid'),
('U', 'UNPAID'),
)

status = models.CharField(
    max_length=1, choices=STATUS_CHOICES)
updated = models.DateTimeField(default=datetime.now() )
expiry = models.DateTimeField(default=datetime.now() + timedelta(days=30) )

def save(self):
    if(self.expiry >= self.updated):
        self.status = default = "P"
    else:
        self.status = default = "U"
        self.expiry = default=self.updated+timedelta(days=1)

    super(Users, self).save()

2 个答案:

答案 0 :(得分:0)

DateTimeField具有auto_now属性,每次保存对象时都会将字段设置为当前日期。

主要问题是什么事件应该触发保存操作。例如,您可以改进视图,以便每当有人访问该页面时,您的模型将更新以及所需的DateTimeField。另一方面,您可能希望在计划的基础上发生这种情况,因此您应该使用CronCeleryHuey之类的内容。

答案 1 :(得分:0)

在您的情况下,您有两种选择。

  1. 制作一些将定期执行的代码,这些代码将根据当前日期更新状态。
  2. 根本不要在数据库中存储状态。如果它只能来自expiry字段,那么它可以是计算出的property
  3. P.S。

    这与你的要求无关,但我有一个建议。永远不要使用datetime.now()的直接结果作为DateTimeField的默认值。这对你有误导性,它与你想要达到的目标不同。 datetime.now将在导入时执行(当服务器启动时),并将保持不变直到下次重新启动。 如果您希望默认值是创建记录的确切时间,那么default值必须是一个函数(每次都会执行)而不是函数的结果。 这意味着updated必须是DateTimeFiled(default=datetime.now)(没有括号)。

    此逻辑更类似于名为created_atdate_created而非updated的字段,但这是您的逻辑。