我有一个'项目'模型,我创建了其中4个名字'Alan Parson','Gutenberg','Gutenberg'和'X'。
我刚才意识到,我希望名称是唯一的,所以我在project.name字段中设置unique = True
现在,我不能创建另一个'Gutenberg'或'X'或者其他什么,但django对先前模型具有非唯一名称的事实没有任何问题。
django如何确保新领域的独特性?为什么旧的不是唯一的并不重要,而且 - 通常 - 无论如何都要告诉哪个模型字段属性(空,空白,唯一......等)需要对其进行“硬”更改。数据库架构和迁移?
看起来如果我尝试使用非唯一名称(从模型表单)编辑其中一个现有项目,我得到一个关于名称如何非唯一的错误,但我可以访问这些模型没有问题,甚至在没有警告的情况下将其他对象添加到他们的多个字段中。这与我的最后一个问题相关 - 似乎模型中指定的一些参数决定了他们的模型形式是如何工作的,而不是他们的工作方式。我认为blank = true意味着模型表单字段可以为空,但是null = true是“更强”,因为它意味着如果实际字段本身是无数据的则可以。
所以,基本上,有没有办法轻松查看哪些参数更改需要迁移或“硬”数据库更改
答案 0 :(得分:2)
这是在数据库级别和模型验证中强制执行的。
您所描述的行为听起来就像您正在获得模型验证部分(例如,当您尝试使用ModelForm
添加新对象时Django所执行的操作)但不是数据库约束部分;而这几乎肯定意味着您在更改模型后没有成功创建和运行迁移。
更广泛地说,您正确地注意到某些模型字段参数会影响Django的行为,而某些模型字段参数会影响数据库。 null
创建数据库约束,而blank
影响ModelForms
。 db_index
影响数据库,而default
总是由Django处理。而unique
会影响两者。
“那么,基本上,有没有办法轻松查看哪些参数更改需要迁移或'硬'数据库更改?”
查看是否需要迁移的简便方法是运行makemigrations
。如果它创建了一个迁移,那么它是必要的,你应该运行它。正如the documentation所说,这并不意味着您的更改正在触及数据库:
Django将对模型或字段的任何更改进行迁移 - 甚至是不影响数据库的选项 - 因为它可以正确重建字段的唯一方法是在历史记录中进行所有更改,并且您可能需要稍后在某些数据迁移中的那些选项。
在大多数情况下,这种区别并不重要;但是如果你关心,最好的方法是阅读有关参数的文档,并查看生成的迁移以查看正在执行的操作。