用南方写一个高级迁移

时间:2013-07-11 10:12:37

标签: django django-south

我刚刚在我的模型“Realm”中添加了一个字段“is_capital”,其外键指向“User”。

这就是它的样子:

class Realm(models.Model):
    user = models.ForeignKey(User)
    is_capital = models.BooleanField( default=False ) #field not synced yet
    #...

默认情况下,我希望每个用户的所有记录都将“is_capital”标志设置为false,所有这些都是第一个(或者是随机的)。最后,每个用户应该只有一个“领域”标记为“is_capital”。

所以表格最后应该是这样的:

realm_id ; user_id ; is_capital
1 ; 1 ; True
2 ; 1 ; False
3 ; 1 ; False
4 ; 2 ; True
5 ; 2 ; False

我该如何进行此类迁移?我看到的所有示例都只是用一个值填充新列。

1 个答案:

答案 0 :(得分:1)

添加架构迁移以使用default=False添加字段。

python manage.py schemamigration app_name --auto

运行此迁移。

然后创建数据迁移以进行更改

./manage.py datamigration app_name mark_is_capital

在您创建的迁移文件的forwards()中,写下:

for user in orm.User.objects.all():
    realms = orm.Realm.objects.filter(user=user)
    if realms:
        realm_to_change = realms[0]
        realm_to_change.is_capital = True
        realm_to_change.save()