gpt4 book ai didi

django - 如何从自定义主键迁移到默认 ID

转载 作者:行者123 更新时间:2023-12-04 02:20:39 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





What is the best approach to change primary keys in an existing Django app?

(8 个回答)


去年关闭。




我创建了一个电子邮件地址作为自定义主键的模型,如下所示:

email = models.EmailField(max_length=255, primary_key=True,)

现在我意识到这对我来说不是一个好主意,我想回到自动生成的 id 字段作为主键。

如何做到这一点?我以不同的方式尝试过这个,但都失败了。我将 Django 1.10.4 与 Python 3.4.3 与 SQLite 数据库一起使用。
  • 我只是用 unique=True 替换了 primary_key=True 选项。 python manage.py makemigrations投诉:

  • 您正在尝试向没有默认值的用户添加不可为空的字段“id”;我们不能这样做(数据库需要一些东西来填充现有的行)。

    如果我指定 0作为默认值, python manage.py migrate失败 django.db.utils.IntegrityError: UNIQUE constraint failed: login_user.id
  • 基于此帖子 Change Primary Key field to unique field我尝试手动添加一个 Autofield,如下所示:

    id = models.AutoField()

  • 现在 python manage.py makemigrations失败:
    login.User.id: (fields.E100) AutoFields must set primary_key=True.

    如果我按照错误消息的建议进行操作,则会遇到与第一次尝试相同的问题:缺少默认值。
  • 我尝试创建一个字段 id=IntegerField(unique=True)(遵循 https://docs.djangoproject.com/en/1.10/howto/writing-migrations/#migrations-that-add-unique-fields 处的 Django 文档),然后将字段类型更改为 AutoField(primary_key=True)。同时,我需要将电子邮件字段更改为 unique=True 以避免有两个主键。经过这些更改,makemigrations工作正常,但 migrate因回溯和此错误而失败:django.db.utils.OperationalError: duplicate column name: id似乎是在尝试创建一个额外的“id”列,不知道为什么。

  • 这样做的正确方法是什么?此外,如果成功,是否会正确更新引用我的用户的 ForeignKey 字段?

    最佳答案

    这种情况很难解决,特别是在实际上甚至没有 real ALTER TABLE statement 的 sqlite 上。

    SQLite supports a limited subset of ALTER TABLE. The ALTER TABLEcommand in SQLite allows the user to rename a table or to add a newcolumn to an existing table.


    大多数类型,django 都是通过临时表进行更改。所以你也可以这样做
    第一步:创建一个新模型,就像
    class TempModel(models.Model):
    email = models.EmailField(max_length=255)
    # other fields from your existing model
    请注意,您不需要显式声明主键字段。只需在电子邮件字段中关闭它就足够了。
    第 2 步:进行迁移和迁移
    第 3 步:打开您最喜欢的数据库客户端并执行以下操作:
    INSERT INTO myapp_tempmodel(fields,....) SELECT * FROM myapp_oldmodel
    第 4 步:删除旧表,进行迁移和迁移
    第 5 步:重命名临时表,进行迁移和迁移

    关于django - 如何从自定义主键迁移到默认 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41185561/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com