假设我有一个模型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()
有没有办法将该代码添加到南向前迁移文件中?有没有更好的方法来解决这个问题?有什么想法吗?
答案 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)
其他方法包括将其拆分为三次迁移(如果生产环境中有大型数据集,则更好的说法):
python manage.py datamigration myapp
),并在其中插入代码以执行上面建议的操作。South docs有something along these lines。还有一个类似的问题here可能会提供见解。