2015-11-08 116 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