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'
ベースを削除して、移行をアプリにするだけです
makemigrationsappnameをまだ実行しましたか?
NOT NULL制約が失敗しました
このエラーは通常、必須フィールドが指定されていないことを意味しますが、画像フィールドにblank = Trueおよびnull = True属性を設定したことがわかります。
私たちが直面している同様の問題も、ローカルでblank = true、null = trueを削除して確認しましたが、運用サーバーではうまく機能しませんでした。
問題が発生したアプリ内のファイル、それらの移行フォルダーよりも、すべてのファイルを削除してから
python manage.py makemigrations
そして
python manage.py migration
どちらも機能し、runserverも適切に機能します。
Migrationsフォルダーに移動し、名前が000 * _lastAction_blah-blahタイプのファイルを手動で削除します。0001_initial.pyファイルを除いて、おそらくすべて削除できます。 ./manage.pyを実行した後、マイグレーションをapp_you_are_updateingすると、データベースが更新されます。
モデルにフィールドを追加した場合(またはフィールドを変更した場合)、移行するとDjangoは前のレコードを検索し、それらがフィールドに指定された制約を満たしているかどうかを確認します。
あなたの場合、ImageFieldにnull = True
を許可した場合でも、Djangoがその列をデータベースに追加しようとすると、そのフィールドの値が定義されていないことがわかります'以前のレコード。
ソリューション: ImageFieldにdefault = None
を追加する必要があります。これにより、以前のレコードの値が作成されますNULL
。
さらに、 when Djangoが移行を実行する場合、移行番号(たとえば、python manage.py migrate your_app_name 00xx
)を指定しても、以前の移行での依存関係をチェックします。 、ここで行った移行によりエラーが発生したため、それを修正して(指定どおりに)移行しようとしても、同じエラーが発生します。
したがって、最初にエラーを引き起こしたものまでのすべての以前の移行を削除し、makemigrations
を再度実行する必要があります。その後、migrate
を問題なく実行できます。