如何在倒计时后删除Django对象?

时间:2017-10-26 16:57:57

标签: django django-models

在我正在开发的平台中,我们希望用户能够为他们创建的对象设置到期时间。在倒计时后,他们设置过期,该对象应该被删除。

你会如何推荐这样做?

编辑:我应该澄清,到期时间因每个对象而异。

2 个答案:

答案 0 :(得分:4)

执行所描述内容的最常见方法是创建一个存储创建时间的列和到期时间列,并且只需考虑在到期时间后删除的项目。

必须在针对该表的任何查询中包含条件,以便在您打算检索未过期项目列表时过滤掉过期的项目。

如果由于某种原因(例如监管数据或业务需求)消除数据很重要,您可以设置定期任务(如cron作业)来删除任何已过期的记录。这可能(并且经常)与我上面描述的方法结合使用,这样即使自上次运行周期性任务以来某些对象已过期,您也可以确信用户看到了正确的数据。

答案 1 :(得分:0)

Jiaaro完全正确:您应该在模型内部存储创建日期,而不是依赖于在正确的时间完全删除它,然后覆盖此模型的默认QuerySet。查看here了解更多信息。

管理员是添加/更改搜索功能的一种方式。覆盖get_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清除陈旧数据。毛里西奥的链接显示了如果你感兴趣的话如何做到这一点。这不会改变最终结果,但可以让您的查询更快一些。