我希望能够在end_suspension_date经过(因此如果存在)时自动将悬浮状态设置为False(当然,如果为True)。
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...
答案 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日期而不是本地日期。