django检查岗位到期功能

时间:2014-12-21 02:40:44

标签: python django

我是新手,我正在尝试构建一个功能,检查列表到期时间。如果它已过期,我想要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)

3 个答案:

答案 0 :(得分:2)

目前还不清楚你想要做什么。从你的问题,我明白可能:

  1. 您想在给定条件的情况下将in_progress设置为False的实例上添加方法吗?
  2. 您想创建一个遍历所有Post个对象的函数,并在满足某些条件的对象上设置in_progressFalse吗?
  3. 您想要制作这样的功能并定期运行吗?
  4. 您希望在特定时刻检查某些条件(加载对象/保存对象)并根据这些条件更新in_progress
  5. 根本不需要in_progress字段,您可以设置一个只读属性,根据某些条件返回TrueFalse
  6. 最简单的选择,如果你不需要在字段上进行数据库查询,只需将其完全删除并让它成为计算属性,如下所示:

    @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的值(即,当有人发出请求时)。