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に少なくとも 1 つRankingの が必要なので、新しい Person オブジェクトを作成するRankingときに、オブジェクトごとに新しいオブジェクトを作成するだけです。

私が知らないのは、データベース内の既存のPerson オブジェクトRankingごとに新しいデフォルト インスタンスを作成する方法です。

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)

他のアプローチには、これを 3 つの移行に分割することが含まれます (これは、運用環境に大きなデータセットがある場合に適しています)。

  1. モデルを追加します。人物フィールドは必須ではありません
  2. 別のデータ移行 ( python manage.py datamigration myapp) を追加し、上記で提案したことを行うコードを挿入します。
  3. 上記の 2 つの移行を実行します (必要に応じて時間がかかります)。
  4. すべて入力したら person フィールドを に変更し、この最終的な移行を実行します

South のドキュメントには、これらの方針に沿ったものがありますここにも同様の質問があり、洞察が得られる可能性があります。

于 2013-11-12T10:49:17.587 に答える