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

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

我可以想到的实现方式是添加计划任务,每天扫一遍找出删除时间满 30 天的进行删除,但是有哪些更好的的实现方式呢?
3086 次点击
所在节点    Python
9 条回复
cljnnn
2018-01-01 12:18:06 +08:00
直接 SQL 命令操作 database,可以不?
leopardwei
2018-01-01 13:01:01 +08:00
crontab、celery 或者自己写个守护进程每天轮询
Hstar
2018-01-01 13:29:48 +08:00
软删除比较简单, 插入时设定过期时间, 查询时过滤过期时间.
dangyuluo
2018-01-01 14:21:02 +08:00
楼上根据时间软删除是正解。
siteshen
2018-01-01 14:32:29 +08:00
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-01-01 15:01:41 +08:00
你的通过计划任务定时删除的实现方式就是最好的方式。

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

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

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

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

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

© 2021 V2EX