web-dev-qa-db-ja.com

デフォルトなしで、null不可フィールド「id」をcontact_infoに追加しようとしています

私は単純なコマンド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)
13
shashank

`default =" "とeditable = Falseも設定できます。

例:first_name = models.CharField(max_length=50, default="", editable=False)

Idフィールドを追加する必要はありません。 Djangoは自動的に追加します。

編集:移行フォルダー内の最後の移行ファイルを削除して、再試行してください。動作しない場合は、同じプロセスを繰り返します。「makemigrations」コマンドが動作するときに正しいファイルを削除したことがわかります。

10
pycod333

これは、別のフィールドがprimary_key=Trueで主キーとしてマークされていて、それを削除しているときに発生します(その場合Djangoはid主キーを追加しようとします)。

Djangoは主キーのデフォルト値を要求しているのはバグのようです。

この問題を回避するには、次の手順を実行します。

  1. 移行中にプロンプ​​トが表示されたら、ランダムなデフォルト値を指定します。

  2. 生成された移行ファイルに移動します(your_app\migrations\の下で、default=x,を削除します。xは手順1で指定したランダムな値です。

  3. 移行ファイルを開いている間、アクションの順序が理にかなっていることを確認してください(たとえば、1つの主キーを削除/変更してから別の主キーを追加します)。保存して閉じます。

  4. 通常どおり移行します。

27
mehmet

デフォルト値を設定する必要があります。例えば:

field_eg = models.CharField(default="")

手段:

name = models.CharField(max_length=100, default="")
2

私の意見では、移行を完全に削除することは怠laで悪い考えです。 @Afiz Mominに似たスナフを作り、自分で掘り出すことができました。

次のセットアップがありました。

  1. ベース抽象モデル。
  2. 作成後にidフィールドをオーバーライドします(悪い考え)
  3. 他のすべてのサブクラスは、Django=移行をトリガーして、親クラスから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列を削除しましたが、これは明らかに持続不可能でした。しかし、気まぐれに私は次のことをしました:

  1. 移行ディレクトリをmigrations.origにバックアップします。
  2. ./manage.py makemigrationsを実行して、すべての移行を行います。
  3. 新しく作成された移行ファイル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>),
    ),
  1. migrations.origに戻り、移行を検索しますモデルが最初に作成された場所。移行ラインは上記のようになります。
  2. migrations.origで行を見つけたら、新しい移行コードに合わせて変更します。
  3. 元の移行を復元します。 migrationsを削除し、migrations.origの名前をmigrationsに変更します。
  4. 適切に測定するために、./manage.py makemigrationsおよび./manage.py migrateを実行します。エラーメッセージはもう表示されないはずです!
  5. 別のモデルについて不平を言う場合は、説明されている同じ手順に従ってください。
1
Dash2TheDot

これは、models.pyにいくつかの変更を加えてから移行を試みた場合にも発生する可能性があります。一度私に起こった。結局、データベース全体を削除しても解決しませんでした。外部キーを追加した後にエラーが発生する場合は、デフォルトを提供できないか、デフォルトをnullに設定しても安全ではない可能性があります。

おそらくDjangoはmyapp/migrations /フォルダーに以前の移行ファイルのいくつかをまだ持っています。これらのファイルを削除すると役立つ場合があります。

0
Chandan

これは、空でないデータベースがあるために発生しています。 Django ORM。で作成されていない行が必要です。

以下を実行します。python manage.py Shell

from <path_to_your_models> import *
print len(list(contact_info.objects.filter(id = None)))

これにより、そのような行がいくつあるかがわかります。それらを保持したい場合は、値を指定して移行スクリプトを作成します。

0
Jan Skácel

移行を行うときに、同様の問題が発生しました。モデルに「Identity」という名前の主キーと、他のフィールドにメイクマイグレーションを適用しました。後で、主キー名を「_id」に変更すると、このエラーが発生しました。

null不可フィールド「_id」をデフォルトなしでswapidentityに追加しようとしています。それを行うことはできません(データベースには既存の行にデータを入力する必要があります)

エラーは少し誤解を招く可能性がありますが、「_ id」を「Identity」に戻すと、そのエラーは発生しません。

直し方?移行パッケージで生成された移行スクリプトを削除します。または、生成された移行スクリプトで主キーを手動で変更します。

0
Afiz

移行ファイルを確認する

./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>

0
sarath kumar