Django南迁外键

时间:2014-01-29 16:52:34

标签: python mysql django migration django-south

所以我有给定的模型:

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的外键,而不是两者。但是现在逻辑已经改变,所以总是有{{1外键,有时是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字段对象具有外键的同一Foo对象的外键。这是逻辑上的结论:

  1. 删除bar
  2. 使用FooBar.foo_flag个对象填充所有null foo个外键 Foo外键
  3. Bar字段
  4. 中不再允许null

    我怎样才能编写此迁移?

1 个答案:

答案 0 :(得分:2)

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

  1. 数据迁移,您可以遍历所有 FooBar 项并填充正确的值。
  2. 架构迁移,您可以在其中设置NOT NULL约束到ForeignKeys。 South将为未填充的项目请求“默认”值。在大多数情况下,你不应该有这些项目,但是如果出现问题,你需要很容易检测到的价值,所以你应该制作 Foo 项并将其ID设置为默认值。
  3. 架构迁移,删除 FooBar.foo_flag
  4. 迁移后,我建议检查 Foo 对象链接表,并在出现问题时手动修复数据。