2016-06-08 136 views
0

我正在爲我的一個項目實現Django模型的軟刪除系統,並遇到了與「軟刪除」數據衝突的新數據問題。理想情況下,我希望保留已刪除模型和新模型,但也會對現有模型實施獨特約束。與Django軟刪除數據庫衝突

所以基本上我希望能夠添加獨特的字段,除非刪除=真,在這一點上,你可以有多少你想要的。有沒有辦法做到這一點,不涉及手動覆蓋我想要軟刪除的每個模型的保存功能?

+0

你可以添加你的代碼嗎?您應該找到一些方法來避免強制執行唯一性。是否可以在軟刪除模型實例時將'unique'字段設置爲'null'? –

+0

你使用了哪個數據庫? –

+0

@KevinChristopherHenry我正在使用PostgreSQL。 –

回答

2

由於您使用PostgreSQL,一個簡單的解決方案是創建一個部分唯一索引;也就是說,只有當某個表達式爲真時,纔會執行唯一約束的索引。

首先,您將擺脫模型中的unique=True並創建遷移。然後,您將創建一個空遷移並將您的索引創建語句放入其中。有關更多詳細信息,請參閱我的回答here

你的遷移應該是這個樣子:

class Migration(migrations.Migration): 
    dependencies = [ ... ] 

    operations = [ 
     migrations.RunSQL("CREATE UNIQUE INDEX my_constraint 
          ON appname_modelname (unique_field) 
          WHERE deleted = false") 
    ] 

注意,Django不知道這個指標任何東西,所以它不能夠做任何驗證。因此,如果您希望管理員用戶在違反約束條件時收到錯誤消息,則應提供自己的驗證。

+0

如何在測試中使用sqlite? –

+1

@OlegTikhonov:從版本3.8起,SQLite具有[部分索引](https://www.sqlite.org/partialindex.html)。我不知道在所有情況下語法是否與PostgreSQL相同。 –