如何在倒计时后删除Django对象?
在我正在使用的平台中,我们希望用户能够设置他们创建的对象的过期时间。在他们设置的倒计时过期后,应该删除该对象 你建议怎么做如何在倒计时后删除Django对象?,django,django-models,Django,Django Models,在我正在使用的平台中,我们希望用户能够设置他们创建的对象的过期时间。在他们设置的倒计时过期后,应该删除该对象 你建议怎么做 编辑:我应该阐明每个对象的到期时间会有所不同。 < P>最常见的方法是创建一个存储到期时间和列的时间的列,并简单地考虑到期时间后删除的项目。 您必须在针对该表的任何查询中包含一个条件,以便在您打算检索未过期项目列表时筛选出过期项目 如果出于某种原因(如法规要求或业务要求)删除数据很重要,则可以设置定期任务(如cron作业)来删除任何过期的记录。这可以(并且经常)与我上面描述
编辑:我应该阐明每个对象的到期时间会有所不同。
< P>最常见的方法是创建一个存储到期时间和列的时间的列,并简单地考虑到期时间后删除的项目。 您必须在针对该表的任何查询中包含一个条件,以便在您打算检索未过期项目列表时筛选出过期项目如果出于某种原因(如法规要求或业务要求)删除数据很重要,则可以设置定期任务(如cron作业)来删除任何过期的记录。这可以(并且经常)与我上面描述的方法结合使用,这样您就可以确信用户看到的数据是正确的,即使自上次运行定期任务以来某些对象已过期。Jiaaro完全正确:与其依赖于在正确的时间删除它,您应该将创建日期存储在模型内部,然后覆盖此模型的默认查询集。查看更多信息 管理器是添加/更改搜索功能的一种方式。重写
get\u queryset()
会更改执行MyModel.objects.all()时看到的内容。在您的情况下,您的经理将如下所示:
class MyModelManager(models.Manager):
def get_queryset(self):
now = datetime.now()
min_created_at = #now - 30 minutes
return super(MyModelManager, self).get_queryset().filter(created_at__gt=min_created_at)
class MyModel(models.Model):
created_at = models.DateField(auto_now_add=True, db_index=True)
objects = MyModelManager()
然后,除此之外,您还可以间歇性地使用cronjob清除过时的数据。Mauricio的链接展示了如果你感兴趣的话如何做到这一点。这不会改变最终结果,但可以让您的查询速度更快。您可以阅读这篇精彩的文章,这将有助于我完成cron任务。我们已经创建了at列。您建议使用什么作为到期时间列?它是否应该是另一个时间字段,我们手动添加当前时间和用户输入?这是一个非常好的答案,但是否有一种类似SQL server agent的方法?@joe是否有一个int列指示对象应该生存的分钟数/小时数,或者是否有另一个时间戳并不重要。如果使用另一个时间戳,使用django ORM进行过滤查询会更容易一些(因为过滤查询只依赖于一列。是的,我可能会使用一个时间戳,在收集过期时间的表单中,用户可以输入一个时间量,我会保存当前时间+他们的过期时间。