web-dev-qa-db-ja.com

django.db.utils.IntegrityError:NOT NULL制約が失敗しました:products_product.image画像フィールドのエラー

Imagefieldをmodels.pyに追加し、media_cdnディレクトリにアップロードしたいのですが、base.model.pyに移行すると、このエラーが発生します

Django.db.utils.IntegrityError: NOT NULL constraint failed: products_product.image ERROR WITH IMAGE FIELD

Cmdからの出力

operation.database_forwards(self.app_label, schema_editor, old_state, project_state)

ファイル "C:\ Users\PANDEMIC\Desktop\td10\lib\site-packages\Django\db\migrations\operations\fields.py"、line 84、in database_forwards field、File "C:\ Users\PANDEMIC\Desktop\td10\lib\site-packages\Django\db\backends\sqlite3\schema.py "、行231、add_field self._remake_table(model、create_fields = [field])ファイル" C:\ Users\PANDEMIC\Desktop\td10\lib\site-packages\Django\db\backends\sqlite3\schema.py "、行199、_remake_table self.quote_name(model._meta.db_table)、ファイル" C:\ Users\PANDEMIC\Desktop\td10\lib\site-packages\Django\db\backends\base\schema.py "、112行、execute cursor.execute(sql、params)ファイル" C:\ Users\PANDEMIC\Desktop\td10\lib\site-packages\Django\db\backends\utils.py "、79行目、execute return super(CursorDebugWrapper、self).execute(sql、params)ファイル" C:\ Users\PANDEMIC\Desktop\td10\lib\site-packages\Django\db\backends\utils.py "、64行、execute return self.cursor.execute(sql、params)ファイル" C:\ Users\PANDEMIC\Desktop\td10\lib\site-packages\Django\db\utils .py "、94行目、 exit six.reraise(dj_exc_type、dj_exc_value、traceback)ファイル "C:\ Users\PANDEMIC\Desktop\td10\lib\site-packages\Django\utils\six.py"、行685、 reraise raise value.with_traceback(tb)File "C:\ Users\PANDEMIC\Desktop\td10\lib\site-packages\Django\db\backends\utils.py"、line 64、in execute return self.cursor.execute( sql、params)ファイル "C:\ Users\PANDEMIC\Desktop\td10\lib\site-packages\Django\db\backends\sqlite3\base.py"、行337、execute return Database.Cursor.execute(self、 query、params)Django.db.utils.IntegrityError:NOT NULL制約が失敗しました:products_product.image

from Django.db import models

# Create your models here.

class Product(models.Model):
    name = models.CharField(max_length=40)
    description = models.TextField(max_length=220, blank=True, default=None)
    image = models.ImageField(upload_to="/products_images/", null=True, blank=True, width_field="width_field", height_field="height_field")
    width_field = models.IntegerField(default=0)
    height_field = models.IntegerField(default=0)
    is_active = models.BooleanField(default=True)
    publish = models.DateField(auto_now=False, auto_now_add=True)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

    def __str__(self):
        return "%s" % self.id

    class Meta:
        ordering = ["-timestamp"]
        verbose_name = 'Product'
        verbose_name_plural = 'Products'
8

ベースを削除して、移行をアプリにするだけです

0

makemigrationsappnameをまだ実行しましたか?

NOT NULL制約が失敗しました

このエラーは通常、必須フィールドが指定されていないことを意味しますが、画像フィールドにblank = Trueおよびnull = True属性を設定したことがわかります。

2
Gerry Hernandez

私たちが直面している同様の問題も、ローカルでblank = true、null = trueを削除して確認しましたが、運用サーバーではうまく機能しませんでした。

問題が発生したアプリ内のファイル、それらの移行フォルダーよりも、すべてのファイルを削除してから

python manage.py makemigrations

そして

python manage.py migration

どちらも機能し、runserverも適切に機能します。

1
Tejas Tank

Migrationsフォルダーに移動し、名前が000 * _lastAction_blah-blahタイプのファイルを手動で削除します。0001_initial.pyファイルを除いて、おそらくすべて削除できます。 ./manage.pyを実行した後、マイグレーションをapp_you_are_updateingすると、データベースが更新されます。

1
Nomad Owl

モデルにフィールドを追加した場合(またはフィールドを変更した場合)、移行するとDjangoは前のレコードを検索し、それらがフィールドに指定された制約を満たしているかどうかを確認します。

あなたの場合、ImageFieldにnull = Trueを許可した場合でも、Djangoがその列をデータベースに追加しようとすると、そのフィールドの値が定義されていないことがわかります'以前のレコード。

ソリューション: ImageFieldにdefault = Noneを追加する必要があります。これにより、以前のレコードの値が作成されますNULL

さらに、 when Djangoが移行を実行する場合、移行番号(たとえば、python manage.py migrate your_app_name 00xx)を指定しても、以前の移行での依存関係をチェックします。 、ここで行った移行によりエラーが発生したため、それを修正して(指定どおりに)移行しようとしても、同じエラーが発生します。

したがって、最初にエラーを引き起こしたものまでのすべての以前の移行を削除し、makemigrationsを再度実行する必要があります。その後、migrateを問題なく実行できます。

0
dee