2016-06-08 79 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相同。 –