0

列を追加してスキーママイグレーションを作成する場合、フィールドにはnull=Trueまたはdefault=somethingのいずれかが必要であることがわかります。

私が得られないのは、最初にモデルに書き込んだフィールドの多く(たとえば、最初のschemamigration --initの前、またはconverted_to_southアプリから、両方を実行した)は、このチェックに対して実行されなかったということです。 null/defaultエラーはありません。

正常ですか?

なんでそうなの?そして、なぜサウスはこのnull / defaultのことをチェックしているのですか?

4

2 に答える 2

1

すでにいくつかの行が入力されているテーブルに列を追加する場合は、次のいずれかを実行します。

  • 列はnull可能であり、既存の行は単に列のnull値を取得します
  • 列はNULL可能ではありませんが、デフォルト値があり、既存の行は、列のデフォルト値を持つように更新されます

デフォルトなしでnull許容でない列を生成するには、複数のステップで列を追加する必要があります。また:

  • 列をNULL可能として追加し、デフォルトを手動で入力してから、列をNULL不可としてマークします
  • デフォルト値で列を追加してから、デフォルト値を削除します

これらは事実上同じであり、両方とも各行を更新します。

Southはわかりませんが、あなたが説明していることから、列を追加する単一のDDLステートメントを生成することを目的としており、このような複数のステップで追加する機能はありません。多分あなたはその振る舞いを無効にすることができますか、あるいは多分あなたは2つの移行を使うことができますか?

対照的に、テーブルを作成する場合、明らかに既存のデータがないため、デフォルトなしでnull許容でない列を自由に作成できます。

于 2012-10-26T11:09:42.463 に答える
0

データベースに既存のレコードがあり、テーブルの1つに列を追加する場合、データベースに何を入れるかを指示する必要があります。南はあなたの心を読み取ることができません:-)

したがって、新しいフィールドにnull = Trueをマークするか、デフォルト値をオプトインしない限り、エラーが発生します。空のデータベースがある場合、設定する値はありませんが、モデルフィールドには基本的なプロパティが必要です。使用しているフィールドクラスを詳しく見ると、djangoがmax_lengthやnull(フィールドによって異なります)などのデフォルト値を設定していることがわかります。

于 2012-10-26T11:10:01.900 に答える