设置Django' unique'创建具有该字段的非唯一值的模型对象后的模型字段参数?

时间:2015-01-08 18:41:01

标签: django django-models migrate

我有一个'项目'模型,我创建了其中4个名字'Alan Parson','Gutenberg','Gutenberg'和'X'。

我刚才意识到,我希望名称是唯一的,所以我在project.name字段中设置unique = True

现在,我不能创建另一个'Gutenberg'或'X'或者其他什么,但django对先前模型具有非唯一名称的事实没有任何问题。

django如何确保新领域的独特性?为什么旧的不是唯一的并不重要,而且 - 通常 - 无论如何都要告诉哪个模型字段属性(空,空白,唯一......等)需要对其进行“硬”更改。数据库架构和迁移?


看起来如果我尝试使用非唯一名称(从模型表单)编辑其中一个现有项目,我得到一个关于名称如何非唯一的错误,但我可以访问这些模型没有问题,甚至在没有警告的情况下将其他对象添加到他们的多个字段中。这与我的最后一个问题相关 - 似乎模型中指定的一些参数决定了他们的模型形式是如何工作的,而不是他们的工作方式。我认为blank = true意味着模型表单字段可以为空,但是null = true是“更强”,因为它意味着如果实际字段本身是无数据的则可以。

所以,基本上,有没有办法轻松查看哪些参数更改需要迁移或“硬”数据库更改

1 个答案:

答案 0 :(得分:2)

documentation for unique说:

  

这是在数据库级别和模型验证中强制执行的。

您所描述的行为听起来就像您正在获得模型验证部分(例如,当您尝试使用ModelForm添加新对象时Django所执行的操作)但不是数据库约束部分;而这几乎肯定意味着您在更改模型后没有成功创建和运行迁移。

更广泛地说,您正确地注意到某些模型字段参数会影响Django的行为,而某些模型字段参数会影响数据库。 null创建数据库约束,而blank影响ModelFormsdb_index影响数据库,而default总是由Django处理。而unique会影响两者。

“那么,基本上,有没有办法轻松查看哪些参数更改需要迁移或'硬'数据库更改?”

查看是否需要迁移的简便方法是运行makemigrations。如果它创建了一个迁移,那么它是必要的,你应该运行它。正如the documentation所说,这并不意味着您的更改正在触及数据库:

  

Django将对模型或字段的任何更改进行迁移 - 甚至是不影响数据库的选项 - 因为它可以正确重建字段的唯一方法是在历史记录中进行所有更改,并且您可能需要稍后在某些数据迁移中的那些选项。

在大多数情况下,这种区别并不重要;但是如果你关心,最好的方法是阅读有关参数的文档,并查看生成的迁移以查看正在执行的操作。