Создание новых данных при миграции

Предположим, у меня есть модель 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()

Есть ли способ добавить этот код в файл миграции на юг? Есть ли лучший способ решить эту проблему? Любые идеи?


person leonsas    schedule 16.10.2013    source источник


Ответы (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. измените поле человека, чтобы оно было заполнено, и запустите эту окончательную миграцию

В южных документах есть что-то в этом роде. Также есть аналогичный вопрос во время">здесь это может дать понимание.

person nimasmi    schedule 12.11.2013