实例化有关迁移的新数据

时间:2013-10-16 02:55:31

标签: django-models django-south django-orm

假设我有一个模型Person。现在我创建一个新模型:

class Ranking(models.Model):
    person = models.ForeignKey(Person)
    score= models.IntegerField(null=False, default= 100) 
    date_created = models.DateTimeField(auto_now_add=True)

问题是,我希望每个Person至少有一个Ranking,所以在创建新的Person对象时,我可以为每个对象创建一个新的Ranking

我不知道如何为数据库中的每个现有 Person对象创建一个新的默认Ranking实例?

在django脚本中,它看起来很简单:

for person in people:
    Ranking(person=person).save()

有没有办法将该代码添加到南向前迁移文件中?有没有更好的方法来解决这个问题?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

首先,自动生成迁移python manage.py schemamigration myapp --auto

然后在迁移文件中找到类似于以下内容的内容(大概是myapp/migrations/00xx_auto__add__ranking.py):

def forwards(self, orm):
    # Adding model 'Ranking'
    db.create_table(u'myapp_ranking', (
        (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
        ('person', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['myapp.Person'])),
        ('score', self.gf('django.db.models.fields.IntegerField')(default=100)),
        ('date_created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
    ))
    db.send_create_signal(u'myapp', ['Ranking'])

在此之后,插入如下内容:

    # Create 'blank' Ranking entries for all extant Person objects
    for person in orm.Person.objects.all():
        orm.Ranking.objects.create(person=person)

其他方法包括将其拆分为三次迁移(如果生产环境中有大型数据集,则更好的说法):

  1. 添加模型,不需要人员字段
  2. 添加单独的数据迁移(python manage.py datamigration myapp),并在其中插入代码以执行上面建议的操作。
  3. 运行上面的两次迁移(如果需要,允许这需要时间)
  4. 将人员字段更改为全部填充后,并运行此最终迁移
  5. South docssomething along these lines。还有一个类似的问题here可能会提供见解。