【发布时间】:2022-01-15 04:59:29
【问题描述】:
我的模型中的一个字段过去没有约束。
但为了避免将来出现问题,我需要将字段设为unique=True。
这显然会引发Key (field)=(foo) is duplicated
为了不引发错误而向后修复迁移的最佳做法是什么?
【问题讨论】:
标签: django django-models django-migrations
我的模型中的一个字段过去没有约束。
但为了避免将来出现问题,我需要将字段设为unique=True。
这显然会引发Key (field)=(foo) is duplicated
为了不引发错误而向后修复迁移的最佳做法是什么?
【问题讨论】:
标签: django django-models django-migrations
约束在数据库级别应用,因此如果您的表中有不满足约束的现有数据,您将无法避免错误。在设置unique=True 之前,您必须删除重复值或更改它们。否则,您可以在模型 save 方法或表单/序列化程序验证中验证唯一性,而不是使用 db 约束。
【讨论】:
这取决于您迁移内容的方式。
如果您可以在迁移时关闭数据库,那就简单多了。
在迁移过程中同时执行这两项操作。
另一方面,如果您需要保持正常运行,则需要 3 个步骤:
为在此表中创建记录的任何代码添加验证(很可能主要是save 方法,但要注意其他内容),这样就不可能添加更多 个重复值。 (为此,在唯一字段上为表添加索引可能会有所帮助,但根据数据大小、性能要求等可能没有必要。)
一旦这到位并且您知道数据库中只有旧的重复项,并且不能添加更多,请根据您用来确定要删除哪些记录的任何规则删除这些重复项。
最后,运行迁移以将unique 标志添加到该字段。
2 和 3 都可以通过迁移脚本完成,但重要的是,首先完成第 1 步,这样您就不会在清理时或之后添加新的副本。
【讨论】: