Python Django unique“将对象标记为”;删除“;
我正在实现中讨论的第一个选项,即当对象不再处于活动状态时,我设置一个布尔值以将其标记为非活动 我使用此方法的具体原因是,尽管对象不再处于活动使用状态,但它仍可能被引用并显示在各种记录和报告输出中。我不希望Django的ripple delete删除旧记录 我应该如何加强活动对象的唯一性? 最初,我认为应该一起使用Python Django unique“将对象标记为”;删除“;,python,django,database-design,django-models,Python,Django,Database Design,Django Models,我正在实现中讨论的第一个选项,即当对象不再处于活动状态时,我设置一个布尔值以将其标记为非活动 我使用此方法的具体原因是,尽管对象不再处于活动使用状态,但它仍可能被引用并显示在各种记录和报告输出中。我不希望Django的ripple delete删除旧记录 我应该如何加强活动对象的唯一性? 最初,我认为应该一起使用unique\u在数据库级别强制执行约束。在我删除一个对象之前,这一切都很正常,此时添加一个同名的新活动对象违反了唯一性要求。我可以简单地将对象重新标记为活动对象,但实际上我需要一个新对
unique\u
在数据库级别强制执行约束。在我删除一个对象之前,这一切都很正常,此时添加一个同名的新活动对象违反了唯一性要求。我可以简单地将对象重新标记为活动对象,但实际上我需要一个新对象
我在寻找一种能让我说“当活跃时,一起独一无二=真实”的东西。我可以在模型创建代码中强制执行这一点,但在数据库级别强制执行似乎是一个更好的主意
关于哪一个是最好的方法有什么建议吗?还有更好的建议吗
注意:django恢复很酷,但完全不适用于我的应用程序,因为我确实需要不时访问“已删除”对象。您可能有一个唯一的约束:
class Meta:
unique_together = ( ('name', 'active'),)
但是,这意味着您只能有一个名称相同的活动对象和一个非活动对象
如果将active设为NullBooleanField,则可以将NULL设为active,并且(IIRC)具有无限数量的同名非活动对象。至少,PostgreSQL将空值作为约束的一部分解释为不破坏约束。我想我理解您的意思,当您说
一起唯一时
应该保留在数据库级别。在理论上最好的情况下,最好的设计不依赖于理解unique together
的基本DB强制,而是将该约束视为该表的永久规则
从这个想法出发,如果活动/非活动的区别发生在“表级别”上,而不是通过一些花哨的模型攻击
考虑以下几点:
class BaseModel(models.Model):
# all of your fields here
active = models.BooleanField()
class ActiveModel(BaseModel):
class Meta:
unique_together = ('whatever', 'fields')
def make_inactive(self):
# create a new instance of InactiveModel based on
# this instances's values, then delete this instance
class InactiveModel(BaseModel):
def make_active(self):
# create a new instance of InactiveModel based on
# this instances's values, then delete this instance
这样,无论何时创建新模型,都可以使用ActiveModel。然后,仅对活动模型强制使用唯一的_。要将模型标记为非活动,请执行
model.make_inactive
,而不是前一个model.active=False
。您仍然可以继续对BaseModel执行查询,并访问活动和非活动模型。此方法的问题在于相关值。如果我有BaseModel的foreignkey,删除一个ActiveModel对象并将其重新创建为一个非活动模型,那么如果我不进行全面的“修复”,就会破坏这些链接“…在此比较中,两个空值不相等。这意味着即使存在唯一约束,也可以在至少一个受约束列中存储包含空值的重复行。”MySQL句柄的行为类似:“唯一索引创建一个约束,使得索引中的所有值都必须是不同的。如果尝试添加键值与现有行匹配的新行,则会发生错误。对于所有引擎,唯一索引允许包含NULL的列具有多个NULL值。”