使用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按日期时间删除数据库中的条目?的主要内容,如果未能解决你的问题,请参考以下文章