使用mysql和django按日期时间删除数据库中的条目?

Posted

技术标签:

【中文标题】使用mysql和django按日期时间删除数据库中的条目?【英文标题】:Delete entry in database by datetime with mysql and django? 【发布时间】:2011-10-20 13:06:47 【问题描述】:

我在 django 1.3 中使用 mysql,并且我将帖子存储在数据库中。这些帖子会存储一段时间,比如 7 天。持续时间(7 天)结束后如何删除帖子?我不是问如何删除,而是问如何确定何时删除?

我不知道这是否是一种好方法,但我正在考虑这样做的一种方法是当用户查找帖子(已发送查询)并且持续时间已到时,该帖子被删除。此外,当我进行搜索或浏览时,如果从数据库中提取帖子列表,我将浏览列表并删除超过时间限制的帖子。这个实现让我担心的是,当我拉出一个列表时,比如说 10 个帖子,而 9 个超过时间限制,我将不得不获得另一个列表,如果该列表中有超过限制的帖子,我将不得不获得更多 .... 等等。所以一个查询可能会导致很多查询,最终效率很低。那么有没有更好的方法来做到这一点?

或者也许是一个更好的实现方式?

所以基本上,我如何实现一个系统,以使用户永远不会看到超过其持续时间的帖子?

不确定我的措辞是否正确,我真的很困惑如何有效地做到这一点。

【问题讨论】:

【参考方案1】:

您可能希望设置一个计划作业,以便每晚批量删除旧帖子。 this post 中介绍了设置在 Django 环境中运行的计划作业。

最佳答案:

我采用的一种解决方案是这样做:

1) 创建custom management command,例如

python manage.py my_cool_command

2) 使用 cron 在需要的时间运行我的命令。

【讨论】:

hmm 研究了这个和 django-celery,哪种方式更好/更有效?加上基本上我创建作业并使用守护进程 bash 来运行所有内容?【参考方案2】:

你不能在帖子上标出过期日期吗?

class Post(models.Model):
    # ...
    date_expire = models.DateField()

然后我会扩展 save 方法以将 7 天添加到当前日期并将其保存到该字段。然后当用户检索帖子时,

def some_view(request):
    # ....
    posts = Post.objects.filter(date_expire__gte=date_obj)

如果您需要删除它们,一个简单的方法是视图通过类似的 QuerySet 收集过期的帖子并调用 delete()。或者,您也可以设置一个脚本以通过 cron 来运行。

【讨论】:

【参考方案3】:

您应该使用带有简单 SQL DELETE by timestamp 或自定义 django 管理命令的每日 cron 作业。

参考:

Custom django commands

Using contrab with django

【讨论】:

以上是关于使用mysql和django按日期时间删除数据库中的条目?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 分区:按 ID 选择,但按日期删除

如何从日期时间中删除时间

如何在 Mysql 中创建调度程序,但调度程序在我的计算机中按日期触发

如何在 django 中按日期范围过滤记录?

手动从 Django 中的 MySQL 数据库中删除表

Django 按时间过滤日期时间字段,与日期无关