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

Setting Django 'unique' model field parameter after creation of model objects with non-unique values for that field?

我有一个 'project' 模型,我创建了其中的 4 个模型,名称分别为“Alan Parson's”、'Gutenberg'、'Gutenberg' 和 'X.'

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

现在,我无法创建另一个 'Gutenberg' 或 'X' 或其他任何东西,但 django 对以前的模型具有非唯一名称这一事实没有问题。

django 如何确保新字段的唯一性?为什么旧的不唯一并不重要,而且 - 一般来说 - 是否有告诉哪些模型字段属性(空,空白,唯一......等)将需要 'hard' 更改到数据库架构和迁移?


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

所以,基本上,有什么方法可以轻松查看哪些参数更改需要迁移或 'hard' 数据库更改

documentation for unique 说:

This is enforced at the database level and by model validation.

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

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

"So, basically, is there any way to easily see which parameter changes necessitate a migration or 'hard' db change?"

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

Django will make migrations for any change to your models or fields - even options that don't affect the database - as the only way it can reconstruct a field correctly is to have all the changes in the history, and you might need those options in some data migrations later on.

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