gpt4 book ai didi

django - Django 中具有唯一约束的软删除

转载 作者:行者123 更新时间:2023-12-03 19:44:10 25 4
gpt4 key购买 nike

我有这种布局的模型:

class SafeDeleteModel(models.Model):
.....
deleted = models.DateTimeField(editable=False, null=True)
......

class MyModel(SafeDeleteModel):
safedelete_policy = SOFT_DELETE

field1 = models.CharField(max_length=200)
field2 = models.CharField(max_length=200)
field3 = models.ForeignKey(MyModel3)
field4 = models.ForeignKey(MyModel4)
field5 = models.ForeignKey(MyModel5)

class Meta:
unique_together = [['field2', 'field3', 'field4', 'deleted'],]

这里的场景是我从不希望用户删除数据。相反,删除只会隐藏记录。但是,我仍然希望所有非软删除的记录都遵守唯一键约束。基本上,我希望有尽可能多的重复删除记录,但只能存在一个唯一的未删除记录。所以我想包括“已删除”字段(由 django-safedelete 库提供),但问题是 Django 的唯一检查失败,并显示 ['field2', 'field3' 的“psycopg2.IntegrityError:重复键值违反唯一约束” , 'field4', 'deleted'] 因为 NULL 不“等于” NULL 并且它在 PostgreSQL 中产生 false。

有没有办法用我的 Django 模型布局来强制执行 unique_together 约束?或者是否有更好的想法物理删除记录,然后将其移动到存档数据库,如果用户想要恢复记录,那么软件将在存档中查找记录并重新创建它?

最佳答案

是的,从 Django 2.2 版开始,可以使用带条件的 UniqueConstraint。

查看此链接中的文档:https://docs.djangoproject.com/en/2.2/ref/models/constraints/#uniqueconstraint

所以你的模型将是这样的:

class MyModel(SafeDeleteModel):
safedelete_policy = SOFT_DELETE

field1 = models.CharField(max_length=200)
field2 = models.CharField(max_length=200)
field3 = models.ForeignKey(MyModel3)
field4 = models.ForeignKey(MyModel4)
field5 = models.ForeignKey(MyModel5)

class Meta:
constraints = [
UniqueConstraint(fields=['field2', 'field3', 'field4'], condition=Q(deleted=False), name='unique_if_not_deleted')
]

如果您使用的是没有此功能的旧版 Django,您可以使用部分唯一索引创建迁移(在此处查看此问题: Postgresql: Conditionally unique constraint )。

至于您的第二个问题(物理删除记录并将其移至其他地方是否更好),这实际上取决于您的应用程序的特性。如果这些软删除不经常发生并且您的表仍然很小,为了简单起见,我会将记录保留在同一个表中,但是如果表中的记录数量开始快速增长并且它们会影响执行此表上的查询,那么您应该将记录移到别处。您必须评估复杂性和性能之间的权衡。

关于django - Django 中具有唯一约束的软删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58126365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com