4

私はモデルを持っています

class Mystery(models.Model):
    first = models.CharField(max_length=256)
    second = models.CharField(max_length=256)
    third = models.CharField(max_length=256)
    player = models.ForeignKey(Player)

プレーヤーの ForeignKey を追加しましたが、South を使用して移行しようとすると、null=False では作成できないようです。このメッセージがあります:

フィールド 'Mystery.player' にはデフォルトが指定されていませんが、NOT NULL です。このフィールドを追加するため、既存の行に使用するデフォルト値を指定する必要があります。
1. 今すぐ終了し、models.py のフィールドにデフォルトを追加します2.
既存の列に使用する 1 回限りの値を指定します

私はこのコマンドを使用します:

manage.py schemamigration myapp --auto

どうもありがとう !

4

3 に答える 3

11

これは、3 回の移行で達成するのが最適です。

ステップ 1. 新しいモデルを作成し、プレーヤーを null にできるようにします。player = models.ForeignKey(Player, null=True)

ステップ 2.実行./manage.py schemamigration <app> --auto

ステップ 3.実行./manage.py datamigration <app> set_default_players

<app>/migrations/<number>_set_default_players.pyステップ 4.デフォルト プレーヤーの設定に任意のロジックを使用するために、順方向および逆方向に更新します。Mysteryすべてのオブジェクトに の値があることを確認しますplayer

ステップ 5.Mysteryモデルを更新して、 が になるようにしplayerますnull=False

ステップ 6.実行./manage.py schemamigration <app> --auto

ステップ 7.実行./manage.py migrate <app>

于 2014-03-24T17:56:17.823 に答える
2

playerデータベースに Mystery オブジェクトが既に含まれている場合、フィールドを空白にすることはできないため、south はフィールドに入力された値を知る必要があります。

考えられる解決策の 1 つ:

選ぶ

    2. Specify a one-off value to use for existing columns now

次に、1 を入力します。これで、既存のすべての Mystery オブジェクトが pk = 1 の Player を指すようになります。その後、(必要に応じて) 管理ページでこれを変更できます。

于 2013-04-25T09:17:29.940 に答える