如何使用来自其他字段的初始数据在模型中创建新字段?

时间:2013-11-21 13:10:28

标签: django migration django-south

在我的Django应用程序中,我有一个如下模型:

class Foo(models.Model):
  ...
  user = models.OneToOneField(User)
  ...

此处user来自django.contrib.auth.models。我正在使用South进行迁移,我希望使用新的布尔字段扩展Foo,其初始数据等于is_active模型中包含的User字段中的Foo字段用户字段。

1 个答案:

答案 0 :(得分:2)

使用Data migrations

  1. 首先进行架构迁移:将is_active字段添加到Foo类。

    # edit your appnames/models.py
    python manage.py schemamigration appname --auto 
    python manage.py migrate appname
    
  2. 进行数据迁移:

    $ python manage.py datamigration appname copy_is_active
    
  3. 修改appname/migrations/0???_copy_is_active.py,尤其是forwards方法以执行您想要的操作。

    例如,

    ....
    from appname.models import Foo
    
    class Migration(DataMigration):
        def forwards(self, orm):
            for obj in Foo.objects.all():
                obj.is_active = obj.user.is_active
                obj.save()
            #for yn in (True, False):
            #    Foo.objects.filter(user__is_active=yn).update(is_active=yn)
    ...
    
  4. 执行迁移

    $ python manage.py migrate appname