【问题标题】:Setting Django 'unique' model field parameter after creation of model objects with non-unique values for that field?在为该字段创建具有非唯一值的模型对象后设置 Django“唯一”模型字段参数?
【发布时间】:2015-03-06 23:45:26
【问题描述】:

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

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

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

django 如何确保新字段的唯一性?为什么旧的不是唯一的并不重要,而且 - 通常 - 无论如何都可以告诉哪些模型字段属性(空,空白,唯一......等)将需要对db 架构和迁移?


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

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

【问题讨论】:

  • 如果你使用 Django 的迁移,一个唯一的约束将被添加到列中。只需将unique=True 添加到您的字段中,就不会在没有迁移的情况下修改架构。几乎任何模型字段更改都需要迁移。

标签: django django-models migrate


【解决方案1】:

documentation for unique 说:

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的精彩回答。与这部分有关“这几乎肯定意味着您在更改模型后没有成功创建和运行迁移。”我的迁移消息中有一个 --fake 标志,但并不真正理解文档所说的这意味着什么,因为你很清楚你可以试一试吗?
  • @amchugh89:“--fake 选项告诉 Django 将迁移标记为已应用或未应用,但无需实际运行 SQL 来更改数据库架构。”您真正使用此功能的唯一时间是当您有一个想要开始使用迁移的现有应用程序时(例如,如果您升级到 1.7)。重要的是首先创建初始迁移(并使用--fake 应用它),然后然后对您的模型进行更改。此时,您只需像往常一样进行并运行迁移。
猜你喜欢
  • 2013-06-04
  • 2019-06-08
  • 1970-01-01
  • 2021-04-30
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
相关资源
最近更新 更多