0

假设我有一个模型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为每个对象创建一个新的。

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

在 django 脚本中,它看起来很简单,如下所示:

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

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

4

1 回答 1

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. 添加模型,不需要 person 字段
  2. 添加一个单独的数据迁移 ( python manage.py datamigration myapp),并在其中插入代码以执行我上面建议的操作。
  3. 运行上面的两个迁移(如果需要,允许这需要一些时间)
  4. 将 person 字段更改为全部填充后,然后运行此最终迁移

南方文档一些类似的东西。这里还有一个类似的问题可能会提供见解。

于 2013-11-12T10:49:17.587 回答