Django migrations/South:新列从同一记录中获取另一个值的默认值

con*_*d00 3 sql migration django relational django-south

我想在现有表中添加一个新列,但我想根据已有的数据给它一个默认值:

例如,每条记录都有一个start_date.现在我想添加一个open_until列,我想用start_date每个现有记录的值填充它.(即将到来的记录将能够选择不同的价值)

有友好的方式来做到这一点吗?

小智 12

你也可以在南方做.唯一需要注意的是,您需要两个步骤:

  1. 一个架构迁移,增加了open_until列

    from django.db import models
    import datetime
    
    class MyModel(models.Model):
        start_date = models.DateField(),
        open_until = models.DateField(default=datetime.date.today),
    
    Run Code Online (Sandbox Code Playgroud)

    $ python manage.py schemamigration --auto appname

  2. 使用该其他列的值填充现有行的数据迁移

    $ python manage.py datamigration appname populate_open_until

    import datetime
    
    class Migration(DataMigration):
    
        def forwards(self, orm):
            "Set open_until value to that of start_date for existing rows"
            for t in orm.MyModel.objects.all():
                t.open_until = t.start_date
                t.save()
    
        def backwards(self, orm):
            "Revert back to default"
            for t in orm.MyModel.objects.all():
                t.open_until = datetime.date.today
                t.save()
    
    Run Code Online (Sandbox Code Playgroud)

(可选)在步骤1中,您可以提供临时默认值或将其设为可选,并添加第3步

  1. 一种模式迁移,它使open_until列成为必需列.