我是新手,我正在尝试构建一个功能,检查列表到期时间。如果它已过期,我想要in_progress booleanfield = False。
我有什么选择?我无法找到任何聪明的方法来做到这一点。请帮忙。
class Post(models.Model):
title = models.CharField(max_length=120)
description = models.CharField(max_length=300)
in_progress = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now=False, auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True, auto_now_add=False)
expiration_date = models.DateTimeField(auto_now=False, auto_now_add=False, null=True, blank=True)
duration = models.PositiveIntegerField(default=15)
答案 0 :(得分:2)
目前还不清楚你想要做什么。从你的问题,我明白可能:
in_progress
设置为False
的实例上添加方法吗?Post
个对象的函数,并在满足某些条件的对象上设置in_progress
到False
吗?in_progress
?in_progress
字段,您可以设置一个只读属性,根据某些条件返回True
或False
?最简单的选择,如果你不需要在字段上进行数据库查询,只需将其完全删除并让它成为计算属性,如下所示:
@property
def in_progress(self):
return self.expiration_date > timezone.now()
(时区是django.utils.timezone
模块)
答案 1 :(得分:1)
我相信这样的事情对你有用,虽然我没有测试过,所以可能会有拼写错误。
所以情况是这样的,每次添加或更新帖子时都会调用save方法。相同的方法有一些逻辑可以确定日期是否大于今天而不是它已过期,因此将值设置为False。这个逻辑可以是您需要进行的任何日期逻辑,以验证日期是否已过期。
Django有一个内置的Save方法,只要将它们写入数据库,就会调用它的所有模型对象。下面的代码是一个覆盖类对象的save方法的示例。
class Post(models.Model):
title = models.CharField(max_length=120)
description = models.CharField(max_length=300)
in_progress = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now=False, auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True, auto_now_add=False)
expiration_date = models.DateTimeField(auto_now=False, auto_now_add=False, null=True, blank=True)
duration = models.PositiveIntegerField(default=15)
def save(self, *args, **kw):
## your custom date logic to verify if expired or not.
if self.expiration_date < datetime.datetime.now().date():
self.in_progress = False
super(Post, self).save(*args, **kw)
答案 2 :(得分:0)
所以,问题是in_progress确实是一个计算值。出于这个答案的目的,我将假设in_progress取决于到期日期和当前日期。如果当前日期在到期日之后,那么该东西已经过期且不再进行。
因此,假设in_progress取决于一直知道但不在数据库中的东西,我建议你不要在数据库中放入in_progress,而只是在运行时计算它。您可以在Post类中添加一个名为in_progress的方法,它可以在调用时计算in_progress的值(即,当有人发出请求时)。