将主键字段更改为唯一字段

Change Primary Key field to unique field

在设置我的数据库结构时,我很愚蠢地为我的学生 class 将一个名为 "student_id" 的字段设置为 "primary_key=True"。很久以后我才意识到,在(极少数)情况下,有必要更改 said "student_id"。通过表单执行此操作时,Django 会自动复制学生,这不是我想要的。

我想将 "primary_key=True" 更改为 "unique=True",我想知道如何操作。

我目前的计划是向学生 class 添加一个名为 "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 然后像对待没有主键的 classes 一样对待 "id" 字段(即当新学生添加到数据库时自动分配一个新 ID)?

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

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

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

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