私は単純なコマンドpython manage.py makemigrationsを使用しています
ただし、このエラーのみが表示されます。
You are trying to add a non-nullable field 'id' to contact_info without a default;
we can't do that (the database needs something to populate existing rows). Please select a fix:
1) Provide a one-off default now (will be set on all existing rows)
2) Quit, and let me add a default in models.py
これはmodels.pyです:
class Document(models.Model):
docfile = models.FileField(upload_to='documents/')
class contact_number(models.Model):
contact_numbers= models.CharField(max_length=13)
class contact_address(models.Model):
address = models.CharField(max_length=100)
city = models.CharField(max_length=50)
state = models.CharField(max_length=50)
Zip = models.CharField(max_length=5)
class contact_info(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.EmailField()
contact_numbers=models.ManyToManyField(contact_number)
addresses=models.ManyToManyField(contact_address)
`default =" "とeditable = Falseも設定できます。
例:first_name = models.CharField(max_length=50, default="", editable=False)
。
Idフィールドを追加する必要はありません。 Djangoは自動的に追加します。
編集:移行フォルダー内の最後の移行ファイルを削除して、再試行してください。動作しない場合は、同じプロセスを繰り返します。「makemigrations」コマンドが動作するときに正しいファイルを削除したことがわかります。
これは、別のフィールドがprimary_key=True
で主キーとしてマークされていて、それを削除しているときに発生します(その場合Djangoはid
主キーを追加しようとします)。
Djangoは主キーのデフォルト値を要求しているのはバグのようです。
この問題を回避するには、次の手順を実行します。
移行中にプロンプトが表示されたら、ランダムなデフォルト値を指定します。
生成された移行ファイルに移動します(your_app\migrations\
の下で、default=x,
を削除します。xは手順1で指定したランダムな値です。
移行ファイルを開いている間、アクションの順序が理にかなっていることを確認してください(たとえば、1つの主キーを削除/変更してから別の主キーを追加します)。保存して閉じます。
通常どおり移行します。
デフォルト値を設定する必要があります。例えば:
field_eg = models.CharField(default="")
手段:
name = models.CharField(max_length=100, default="")
私の意見では、移行を完全に削除することは怠laで悪い考えです。 @Afiz Mominに似たスナフを作り、自分で掘り出すことができました。
次のセットアップがありました。
id
フィールドをオーバーライドします(悪い考え)だから私は次のようになります毎回makemigrations
を実行しました:
You are trying to add a non-nullable field 'id' to <tablename> without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
しかし、抜け道がありました。
最初の試みでは、偽の値をシードしてから、作成されたid
列を削除しましたが、これは明らかに持続不可能でした。しかし、気まぐれに私は次のことをしました:
migrations.orig
にバックアップします。./manage.py makemigrations
を実行して、すべての移行を行います。0001-initial
を調べます。不平を言うモデルは(<tablename>
)に重要な情報が欠けている可能性があります。私にとっては、bases
引数が欠落していました。
migrations.CreateModel(
name='<ModelName>',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('some_field', models.IntegerField()),
# ... other fields ...
],
options={
'abstract': False,
},
bases=(<base_classes>),
),
migrations.orig
に戻り、移行を検索しますモデルが最初に作成された場所。移行ラインは上記のようになります。migrations.orig
で行を見つけたら、新しい移行コードに合わせて変更します。migrations
を削除し、migrations.orig
の名前をmigrations
に変更します。./manage.py makemigrations
および./manage.py migrate
を実行します。エラーメッセージはもう表示されないはずです!これは、models.pyにいくつかの変更を加えてから移行を試みた場合にも発生する可能性があります。一度私に起こった。結局、データベース全体を削除しても解決しませんでした。外部キーを追加した後にエラーが発生する場合は、デフォルトを提供できないか、デフォルトをnullに設定しても安全ではない可能性があります。
おそらくDjangoはmyapp/migrations /フォルダーに以前の移行ファイルのいくつかをまだ持っています。これらのファイルを削除すると役立つ場合があります。
これは、空でないデータベースがあるために発生しています。 Django ORM。で作成されていない行が必要です。
以下を実行します。python manage.py Shell
from <path_to_your_models> import *
print len(list(contact_info.objects.filter(id = None)))
これにより、そのような行がいくつあるかがわかります。それらを保持したい場合は、値を指定して移行スクリプトを作成します。
移行を行うときに、同様の問題が発生しました。モデルに「Identity」という名前の主キーと、他のフィールドにメイクマイグレーションを適用しました。後で、主キー名を「_id」に変更すると、このエラーが発生しました。
null不可フィールド「_id」をデフォルトなしでswapidentityに追加しようとしています。それを行うことはできません(データベースには既存の行にデータを入力する必要があります)
エラーは少し誤解を招く可能性がありますが、「_ id」を「Identity」に戻すと、そのエラーは発生しません。
直し方?移行パッケージで生成された移行スクリプトを削除します。または、生成された移行スクリプトで主キーを手動で変更します。
移行ファイルを確認する
./manage.py showmigrations <App Name>
[X] 0001_initial
[X] 0002_auto_20181204_1110
を使用して移行を元に戻す
./manage.py migrate <App Name> <migration file name>
例:0001_initialまたはゼロを使用(完全な移行復帰のため)
移行を確認する
./manage.py showmigrations <App Name>
[] 0001_initial
[] 0002_auto_20181204_1110
次に、すべての元に戻す移行を削除して、再度移行します。
./manage.py migrate <App Name>