【问题标题】:Change Primary Key field to unique field将主键字段更改为唯一字段
【发布时间】:2015-11-23 09:06:56
【问题描述】:

在设置我的数据库结构时,我很愚蠢地为我的学生类设置了一个名为“student_id”的字段作为“primary_key=True”。很久以后我才意识到有(很少)有必要更改所说的“student_id”。当通过表单这样做时,Django 会自动复制学生,这不是我想要的。

我想将“primary_key=True”更改为“unique=True”,并且想知道该怎么做。

我目前的计划是向 Student 类添加一个名为“id”的字段,应用迁移,然后进入 shell 并简单地为它分配一个带有 for 循环的运行编号:

counter = 0
for s in Student.objects.all():
    counter += 1
    s.id = counter
    s.save()

然后我会返回到我的 models.py 并将“primary_key=True”行更改为“unique=True”。我如何确保 Django 像对待没有主键的类一样处理“id”字段(即,当新学生添加到数据库时自动分配一个新 ID)?

【问题讨论】:

  • 该模型非常简单:它有一个名为“student_id”的字段,其中“primary_key=True”和许多其他不真正相关的字段 - last_name、first_name、study_since 等等。
  • 我认为您需要重命名->迁移->重命名->迁移周期来实现这一目标

标签: django django-models django-shell


【解决方案1】:

这不是一个万无一失的指南,但希望它能为您指明正确的方向。

添加id 字段时,请使用AutoField 而不是IntegerFieldAutoField 负责在您添加新对象时递增。

创建并填充字段后,您可以设置primary_key=True,并将其从student_id 中删除。

最终,您应该能够从模型中删除显式的 id 字段,因为如果您不手动设置主键,Django 会自动创建一个。

【讨论】:

  • 我是否需要在运行版本中手动设置新 ID(正如我在问题中所建议的那样)?
  • 我不确定,但我希望如此。
猜你喜欢
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2023-01-10
相关资源
最近更新 更多