将 Django 主键更新为 UUID

正如u/heppyReddit 上指出的那样,我最初的实现存在错误。我在填充书籍的新作者外键之前删除了作者的 ID,这意味着该书对作者 ID 的引用不再具有任何意义。我已经修复了这个问题。请参阅此处的原始评论。

这是一个棘手的操作,特别是当其他模型具有目标模型的外键时。一个简短的例子:

复制
复制
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=255)

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

这很棘手,因为Book引用了Authorvia id,而它目前是一个整数。当它变为uuidthough时,Book将对字段有一个整数引用,数据库将引发错误。我们通过将外键降级为常规并慢慢调整它以使用新的主键来uuid解决这个问题。IntegerFielduuidBook

步骤:冷库 www.cqzlsb.com

  1. 添加uuid字段,Author同时将该字段保留id为整数

  2. 按照https://docs.djangoproject.com/en/5.0/howto/writing-migrations/#migrations-that-add-unique-fields进行uuid迁移

  3. Bookauthor外键引用更改Author为整数

  4. 将 设uuid为主Author

  5. Book命名authorauthor_old

  6. 添加新的author外键字段Book

  7. 创建新的空迁移

    1. pythonmanage.pymakemigrations --empty library
  8. 添加一个RunPython步骤来清空迁移,填充authorauthor_old本书的行

  9. 消除Author'sid

  10. Author命名uuidid

  11. 降低author_old

  12. 再次使为Bookauthor

  13. 压缩新的迁移(Migrations | Django documentation | Django)。这可确保如果只应用了一半的迁移,数据库不会处于奇怪的状态。

    1. pythonmanage.pysquashmigrations library 0002 0012

    2. 按照命令输出和迁移文件中所述的步骤将自定义populate_*函数复制到压缩的迁移中

    3. 删除压缩迁移所替换的旧迁移

    4. 重命名压缩的迁移

使用ulidPython libs that I wish were part of the standard library)而不是标准可获得奖励积分uuid.uuid4

查看我的示例存储库的 git 提交历史记录,可在https://github.com/thuibr/django-uuid-migration-example找到。这是查看每个步骤结果的好方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值