我正在爲我的一個項目實現Django模型的軟刪除系統,並遇到了與「軟刪除」數據衝突的新數據問題。理想情況下,我希望保留已刪除模型和新模型,但也會對現有模型實施獨特約束。與Django軟刪除數據庫衝突
所以基本上我希望能夠添加獨特的字段,除非刪除=真,在這一點上,你可以有多少你想要的。有沒有辦法做到這一點,不涉及手動覆蓋我想要軟刪除的每個模型的保存功能?
我正在爲我的一個項目實現Django模型的軟刪除系統,並遇到了與「軟刪除」數據衝突的新數據問題。理想情況下,我希望保留已刪除模型和新模型,但也會對現有模型實施獨特約束。與Django軟刪除數據庫衝突
所以基本上我希望能夠添加獨特的字段,除非刪除=真,在這一點上,你可以有多少你想要的。有沒有辦法做到這一點,不涉及手動覆蓋我想要軟刪除的每個模型的保存功能?
由於您使用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不知道這個指標任何東西,所以它不能夠做任何驗證。因此,如果您希望管理員用戶在違反約束條件時收到錯誤消息,則應提供自己的驗證。
如何在測試中使用sqlite? –
@OlegTikhonov:從版本3.8起,SQLite具有[部分索引](https://www.sqlite.org/partialindex.html)。我不知道在所有情況下語法是否與PostgreSQL相同。 –
你可以添加你的代碼嗎?您應該找到一些方法來避免強制執行唯一性。是否可以在軟刪除模型實例時將'unique'字段設置爲'null'? –
你使用了哪個數據庫? –
@KevinChristopherHenry我正在使用PostgreSQL。 –