Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django unique“将对象标记为”;删除“;_Python_Django_Database Design_Django Models - Fatal编程技术网

Python Django unique“将对象标记为”;删除“;

Python Django unique“将对象标记为”;删除“;,python,django,database-design,django-models,Python,Django,Database Design,Django Models,我正在实现中讨论的第一个选项,即当对象不再处于活动状态时,我设置一个布尔值以将其标记为非活动 我使用此方法的具体原因是,尽管对象不再处于活动使用状态,但它仍可能被引用并显示在各种记录和报告输出中。我不希望Django的ripple delete删除旧记录 我应该如何加强活动对象的唯一性? 最初,我认为应该一起使用unique\u在数据库级别强制执行约束。在我删除一个对象之前,这一切都很正常,此时添加一个同名的新活动对象违反了唯一性要求。我可以简单地将对象重新标记为活动对象,但实际上我需要一个新对

我正在实现中讨论的第一个选项,即当对象不再处于活动状态时,我设置一个布尔值以将其标记为非活动

我使用此方法的具体原因是,尽管对象不再处于活动使用状态,但它仍可能被引用并显示在各种记录和报告输出中。我不希望Django的ripple delete删除旧记录

我应该如何加强活动对象的唯一性?

最初,我认为应该一起使用
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值。”