【问题标题】:Django migration- How to fix uniqueness=True on migration (backwards)?Django 迁移 - 如何在迁移(向后)时修复唯一性 = True?
【发布时间】:2022-01-15 04:59:29
【问题描述】:

我的模型中的一个字段过去没有约束。 但为了避免将来出现问题,我需要将字段设为unique=True

这显然会引发Key (field)=(foo) is duplicated

为了不引发错误而向后修复迁移的最佳做法是什么?

【问题讨论】:

    标签: django django-models django-migrations


    【解决方案1】:

    约束在数据库级别应用,因此如果您的表中有不满足约束的现有数据,您将无法避免错误。在设置unique=True 之前,您必须删除重复值或更改它们。否则,您可以在模型 save 方法或表单/序列化程序验证中验证唯一性,而不是使用 db 约束。

    【讨论】:

    • 是的,问题是我已经有重复的值。在运行迁移之前,我必须编辑它们。谢谢!
    【解决方案2】:

    这取决于您迁移内容的方式。

    如果您可以在迁移时关闭数据库,那就简单多了。

    1. 删除所有重复项。
    2. 添加唯一标志。

    在迁移过程中同时执行这两项操作。

    另一方面,如果您需要保持正常运行,则需要 3 个步骤:

    1. 为在此表中创建记录的任何代码添加验证(很可能主要是save 方法,但要注意其他内容),这样就不可能添加更多 个重复值。 (为此,在唯一字段上为表添加索引可能会有所帮助,但根据数据大小、性能要求等可能没有必要。)

    2. 一旦这到位并且您知道数据库中只有旧的重复项,并且不能添加更多,请根据您用来确定要删除哪些记录的任何规则删除这些重复项。

    3. 最后,运行迁移以将unique 标志添加到该字段。

    2 和 3 都可以通过迁移脚本完成,但重要的是,首先完成第 1 步,这样您就不会在清理时或之后添加新的副本。

    【讨论】:

    • 我已经有重复的值,无法删除数据库。添加索引对我来说听起来不错!
    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 2021-09-23
    • 2018-07-14
    • 1970-01-01
    • 2019-09-22
    • 2021-06-27
    • 2011-08-14
    • 1970-01-01
    相关资源
    最近更新 更多