Django在DateField到期后更改BooleanField值

时间:2018-11-12 22:58:44

标签: django python-3.6

我希望能够在end_suspension_date经过(因此如果存在)时自动将悬浮状态设置为False(当然,如果为True)。

models.py

class Profile(models.Model):
    suspended = models.BooleanField(default=False)
    start_suspension_date =  models.DateField(null=True, blank=True)
    end_suspension_date =  models.DateField(null=True, blank=True)
    # ... other fields

没有第三方应用程序,有没有办法做到这一点?我想在模型中定义一个函数(但是这样做没有多大意义):

def end_suspension(self):
     if date.today() >= self.end_suspension_date:
          self.suspended = False 
          start_suspension_date = None
          end_suspension_date = None
      else:
          # do nothing...

2 个答案:

答案 0 :(得分:1)

您可以尝试一下,例如:

class Profile(models.Model):
    start_suspension_date =  models.DateField(null=True, blank=True)
    end_suspension_date =  models.DateField(null=True, blank=True)
    # ... other fields

    @property
    def suspended(self):
        return date.today() < self.end_suspension_date

答案 1 :(得分:1)

否,您将需要celery之类的东西来定义一个任务,该任务会针对暂停结束进行过滤。

我更喜欢的一种替代方法是用属性替换suspended字段,因为拥有一个存储“用户已被暂停”的字段和一个存储“用户何时不再被暂停”的字段是多余的因为我们知道当前日期。

更惯用的称呼为is_suspended,所以:

class Profile(models.Model):

    ...

    @property
    def is_suspended(self):
        return date.today() < self.end_suspension_date

然后在登录视图上进行权限检查等,只需访问profile.is_suspended

简单胜于复杂:)

Aldi,请注意时区。经验法则:存储UTC日期而不是本地日期。