2015-11-08 46 views
0

在数据库中,我有一个名为date的字段。有没有办法在日期通过时删除一行,以便它不再显示?我试图将它与今天的日期进行比较,但这不会每天都发生,并且人们仍然会在首页加载时看到它。有任何想法吗?当日期通过时从数据库中删除行

回答

0

我相信最好的方法是使用Cron作业或在视图中使用附加的条件来仅显示上述日期之后的行。

+0

事件之前就被删除你能说明? @AlanRezende –

+0

解决方案user2352738使其更好。我不知道你正在处理的代码,但是由于它的显示逻辑(而不是业务逻辑),你可以在你的视图中放一个简单的* if *并且比较日期以显示或不显示行。 但坚持user2352738的答案,你从长远来看会更好。 – AlanRezende

0

我会建议你使用一个mysql事件,因为这会持续运行,不像只触发数据库操作的触发器。你希望这发生在应用程序中发生的任何事情之外,只是基于时间,所以mysql事件将适用于这种情况。看到完整的教程在这里:http://www.sitepoint.com/working-with-mysql-events/

2

从数据库中删除的东西是不安全的,原因很多。从权限开始on_delete逻辑。如果您不确定是否完全需要删除某些内容,请将该行标记为active=false

我不会推荐使用cron,因为它难以维持:你必须在不同环境下手动设置不同的任务,与bash代替python某处复制这些文件在您的VCS工作。

另外,在讨论事件时,我不建议在数据库中存储类似这样的内容,因为它不受VCS控制且难以维护。

如果您的应用程序非常简单schedule是一个选项。

但是,如果你正在寻找像一些额外的信息:

  1. 被删除了哪些行?
  2. 有没有例外?

你可以移动到更复杂的CeleryBeat打开。额外的依赖性(如RedisRabbitMQ)是主要的缺点。

文档:

相关:

+0

我看着调度程序,但似乎只用于调度任务,如每小时或每10分钟。它有一个功能可以在某个日期完成工作吗? @sobolevn –

+0

短暂的看着源说:对不起,没有https://github.com/dbader/schedule/blob/master/schedule/__init__.py – sobolevn

+0

我想我找到了我自己的答案,我发布了它,让我知道你在想什么 –

0

我有一个更简单的方法,我想你可以把它称为“硬编码”。我做了一个叫deleteevent功能,其中有下面的代码

def deleteevent(): 
    yesterday = date.today() - timedelta(1) 
    if Events.objects.filter(event_date = yesterday).count(): 
     Events.objects.filter(event_date = yesterday).delete() 

然后,在所有其他功能我有,我叫这个开头,所以页面加载

+1

好吧,我认为这不是一个好的方法:对于*每个*函数调用你有两个额外的数据库命中,而且你在主线程中执行它。 – sobolevn

相关问题