Django 的 models 如何实现 30 天后自动删除?

2018 年 1 月 1 日
 yearliny
```半个伪代码
class Post(models.Model):
body = TextField()
POST_STATUS = ((0,'草稿'), (1,'发表'), (2,'回收站'))
status = CharField(choice=POST_STATUS)
delete_date = DateField()
```
有一个 Post 的 Model 子类,想要把标记为回收站的文章,删除时间满 30 天后删除。

我可以想到的实现方式是添加计划任务,每天扫一遍找出删除时间满 30 天的进行删除,但是有哪些更好的的实现方式呢?
3868 次点击
所在节点    Python
9 条回复
cljnnn
2018 年 1 月 1 日
直接 SQL 命令操作 database,可以不?
leopardwei
2018 年 1 月 1 日
crontab、celery 或者自己写个守护进程每天轮询
Hstar
2018 年 1 月 1 日
软删除比较简单, 插入时设定过期时间, 查询时过滤过期时间.
dangyuluo
2018 年 1 月 1 日
楼上根据时间软删除是正解。
siteshen
2018 年 1 月 1 日
class Post(models.Model):
expires_at = DateField()


def delete_post(post):
post.update(expires_at=now() + timedelta(days=30))

def list_posts():
Post.query.filter(expires_at < now() + timedelta(days=30)).all()
incompatible
2018 年 1 月 1 日
你的通过计划任务定时删除的实现方式就是最好的方式。

楼上们说的通过时间过滤的方式可行,但是不是最好的方式,在性能敏感的情况下甚至可以说是个很烂的方式。
明明是一个可以在业务低谷期离线运行的任务,却要加在每一个在线查询里面凭白消耗计算资源。
RadishWind
2018 年 1 月 1 日
1.mysql 有基于时间的 trigger 可以实现这个功能( model.raw("xxxx"))
2.后台起一个 demon 每天轮询 清除
3.在 model/middleware/view 中 调用一个检查过期的函数(如果对性能有要求 可以基于概率来做)
virusdefender
2018 年 1 月 1 日
查询的时候,delete_time__lte=timezone.now - 30days
yilai
2018 年 1 月 2 日
基于时间做软删除,真要在库里删掉的话在写个脚本轮询被

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/419118

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX