我正在實施"Marking for deletion in Django"中討論的第一個選項,即當對象不再處於活動狀態時,我設置一個布爾值將其標記爲非活動狀態。Django unique_together並將對象標記爲「已刪除」
我使用這種方法的具體原因是,雖然對象不再處於活動使用狀態,但它仍可能被引用並顯示在各種記錄和報告輸出中。我不希望Django的漣漪刪除來刪除舊記錄。
我應該如何去執行活動對象的唯一性?
最初,我以爲我應該使用unique_together
來強制執行我在數據庫級別的約束。這工作正常,直到我刪除一個對象,此時添加一個具有相同名稱的新活動對象違反了唯一性要求。我可以簡單地將對象重新標記爲活動對象,但我實際上需要一個新對象。
我在找東西,讓我說一些像「唯一一起,當活動=真」。我可以在模型創建代碼中強制執行此操作,但似乎在數據庫級別強制執行它是一個更好的主意。
任何有關這些是最好的方法的建議?有更好的建議嗎?
注意:django-reversion很酷,但完全不適合我的應用程序,因爲我需要不時訪問「已刪除」的對象。
postgresql docs說:「...這兩個空值在這個比較中不被認爲是相等的,這意味着即使存在一個唯一的約束,也可以存儲包含至少一個空值的重複行受限制的列「。 http://www.postgresql.org/docs/8.2/static/ddl-constraints.html – 2009-11-02 02:05:13
MySQL的處理方式類似: 「一個UNIQUE索引創建一個約束條件,使得索引中的所有值都必須是不同的。如果您嘗試添加一個鍵值與現有行匹配的新行,對於所有引擎,UNIQUE索引允許爲包含NULL的列創建多個NULL值。「 http://dev.mysql.com/doc/refman/5.4/en/create-table.html – jnns 2011-04-27 13:12:44