Python django检查到期后功能

Python django检查到期后功能,python,django,Python,Django,我是一个新手,我正在尝试构建一个函数来检查列表是否过期。如果它过期了,我希望进程中的booleanfield=False 我有什么选择?我找不到任何聪明的方法来做那件事。请帮忙 class Post(models.Model): title = models.CharField(max_length=120) description = models.CharField(max_length=300) in_progress = models.BooleanField(

我是一个新手,我正在尝试构建一个函数来检查列表是否过期。如果它过期了,我希望进程中的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)

所以,问题是,进程实际上是一个计算值。为了回答这个问题,我将假设进行中取决于到期日和当前日期。如果当前日期在到期日期之后,则该对象已到期且不再进行


因此,考虑到in_progress依赖于总是已知的东西,但不在数据库中,我建议您不要将in_progress放在数据库中,而只是在运行时计算它。您可以在名为in_progress的Post类上添加一个方法,它可以在调用in_progress时(即,当有人发出请求时)计算in_progress的值。

不清楚您到底想做什么。从你的问题中,我了解到可能:

  • 在给定某些条件的情况下,是否要在实例上添加一个将
    in_progress
    设置为
    False
    的方法
  • 您想创建一个函数,该函数遍历所有
    Post
    对象,并在满足某些条件的对象上将
    设置为
    False
  • 您想创建这样一个函数并定期运行它吗
  • 您想在特定时刻检查一些条件(对象加载/对象保存)并根据这些条件更新
  • 您实际上根本不需要有
    进行中
    字段,您可以设置一个只读属性,根据某些条件返回
    True
    False
  • 如果您不需要对字段执行DB查询,那么最简单的选择就是将其完全删除,并将其作为计算属性,如下所示:

    @property
    def in_progress(self):
        return self.expiration_date > timezone.now()
    

    (时区是django.utils.timezone模块)

    我相信这样的东西对你有用,尽管我没有测试过,所以可能会有打字错误

    所以情况是这样的,每次添加或更新帖子时,都会调用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)
    
    class Post(models.Model):
    title=models.CharField(最大长度=120)
    description=models.CharField(最大长度=300)
    in_progress=models.BooleanField(默认值=True)
    已创建的\u at=models.DateTimeField(auto\u now=False,auto\u now\u add=True)
    更新的\u at=models.DateTimeField(auto\u now=True,auto\u now\u add=False)
    expiration\u date=models.datetime字段(auto\u now=False,auto\u now\u add=False,null=True,blank=True)
    持续时间=models.PositiveIntegerField(默认值=15)
    def保存(自,*参数,**千瓦):
    ##用于验证是否过期的自定义日期逻辑。
    如果self.expiration\u date
    Hi,我希望它能够不断检查,一旦in_progress=False,它就会隐藏帖子,基本上我只希望帖子存在一段时间。好的。您需要能够查询它吗?比如,您需要能够执行
    Post.objects.filter(in\u progress=True)
    ,还是可以执行
    Post.objects.filter(expiration\u date\u gt=timezone.now())
    ?是的,这会更好地对所有非活动的帖子进行排序。两个查询都将获得所有非活动的帖子。区别在于这些知识是如何获得的。在第一种情况下,这些知识是外部的:必须定期更新数据库,可能相当于cron作业。在第二种情况下,知识是内部的:它查找过期的对象,因为它知道如何在给定日期的情况下找到它们。持续时间是创建者希望帖子保持活动状态的天数。它可以工作,但是否有其他方法不断检查它是否过期?我想让它在进展中隐藏自己=错误