2017-08-28 33 views
0

我有2个日期字段,我想自动更新日期 当您阅读我的代码时,您将会了解更多信息。 代码将无法正常工作,直到我自己 更新更新的领域我怎么可以让它自动更新(更新域)自动在django中自动更改日期字段

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() 
+0

你是什么意思的“自动”?您是否希望此代码按计划执行? – d2718nis

+0

@ d2718nis否,直到我打开用户页面并自行更新日期(更新字段)时,代码才会生效。我想这样做是自动的,所以如果今天是21-2而在一个月之后它是21-3它会自动改变状态(取决于到期日期)它不会改变它,直到我手动更新字段 –

回答

0

DateTimeFieldauto_now属性,将在现场设置为当前每次保存对象时记录日期。

主要问题是什么事件应该触发保存操作。例如,您可以改进视图,以便每次有人访问该页面时,您的模型都会根据所需的DateTimeField进行更新。另一方面,您可能希望按计划执行此操作,因此您应该使用Cron,CeleryHuey之类的内容。

+0

它看起来像我被迫使用芹菜。非常感谢 –

+0

samer hassan,不客气。如果这个答案是有用的,不要忘记检查它是正确的。谢谢! – d2718nis

0

就你而言,你有两种选择。

  1. 制作一些定期执行的代码,根据当前日期更新状态。
  2. 根本不要将状态存储在数据库中。如果它只能取决于expiry字段,它可以是一个计算结果property

P.S.

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

这个逻辑更像是一个叫created_atdate_created而不是updated的字段,但这是你的逻辑。

+0

谢谢你指出 –