【问题标题】:Django south migration foreign keyDjango南迁移外键
【发布时间】:2014-02-21 15:09:37
【问题描述】:

所以我有给定的模型:

class FooBar(models.Model):
    foo = models.ForeignKey(Foo,null=True,blank=True)
    bar = models.ForeignKey(Bar,null=True,blank=True)
    foo_flag = models.BooleanField(default=False)
    bar_flag = models.BooleanField(default=False)

其中的逻辑是,在任何时候,FooBar 都可以有一个外键,而不是两者都有。但是现在逻辑已经改变,所以总是有一个 Foo 外键,有时Bar。所以我的新模型看起来像这样:

class FooBar(models.Model):
    foo = models.ForeignKey(Foo)
    bar = models.ForeignKey(Bar,null=True,blank=True)
    bar_flag = models.BooleanField(default=False)

现在是复杂的部分。 Bar 模型如下所示:

class Bar(models.Model):
    foo = models.ForeignKey(Foo)

所以对于数据库中每个先前存在的项目,其中foo 字段为null,因此存在Bar 的外键,我需要foo 字段来获取相同@ 的外键具有bar 字段对象的 987654333@ 对象具有外键。下面是跳出的逻辑:

  1. 删除FooBar.foo_flag
  2. Foo 对象从 Bar外键
  3. foo 字段中不再允许为空

我该如何编写这个迁移?

【问题讨论】:

    标签: python mysql django migration django-south


    【解决方案1】:

    此类情况的最佳做法是进行 3 次独立迁移:

    1. 数据迁移,您可以在其中迭代所有 FooBar 项并填充适当的值。
    2. 架构迁移,您将 NOT NULL 约束设置为 ForeignKeys。 South 将为未填充的项目请求“默认”值。在大多数情况下,您不应该拥有这些项目,但如果出现问题,您需要易于检测的值,因此您应该制作 fake Foo 项目并将其 id 设置为默认值。
    3. 架构迁移,删除 FooBar.foo_flag

    迁移后,我建议检查表中是否存在 fake Foo 对象链接,如果出现问题,请手动修复数据。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 2012-06-05
    • 1970-01-01
    • 2014-06-22
    • 2011-09-28
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多