django.db.utils.IntegrityError:NOT NULL约束失败:products_product.image图像字段错误

Kro*_*mir 5 python sqlite django django-models imagefield

我想向我添加imagefield models.py并上传到我的media_cdn目录中,但是当我迁移到基于model.py的基础上时,他给出了此错误

django.db.utils.IntegrityError: NOT NULL constraint failed: products_product.image ERROR WITH IMAGE FIELD
Run Code Online (Sandbox Code Playgroud)

从cmd输出

operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
Run Code Online (Sandbox Code Playgroud)

文件“ C:\ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ migrations \ operations \ fields.py”,行84,位于database_forwards字段中,文件“ 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,在执行cursor.execute(sql,params)文件“ C:\ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ backends \ utils.py“,第79行,在执行中返回super(CursorDebugWrapper,self).execute(sql,参数”文件“ C:\ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ backends \ utils.py”,第64行,在执行返回self.cursor.execute(sql,params)文件“ C:\ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ utils.py“,第94行,在退出 six.reraise(dj_exc_type,dj_exc_value,traceback)文件“ C:\ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ utils \ six.py”,行685,以提高价值。with_traceback(tb) )文件“ C:\ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ backends \ utils.py”,第64行,在执行返回self.cursor.execute(sql,params)文件“ C :\ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ backends \ sqlite3 \ base.py”,执行返回行中的行3.3。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'
Run Code Online (Sandbox Code Playgroud)

Ger*_*dez 9

你运行makemigrations appname了吗?

NOT NULL 约束失败

此错误通常意味着未提供必填字段,但我可以看到您已在图像字段中设置了blank=True 和 null=True属性。


小智 7

转到migrations文件夹,然后手动删除名称类型为000 * _lastAction_blah-blah的文件,您可以删除所有文件,但可以删除0001_initial.py。在运行./manage.py进行迁移app_you_are_updateing之后,它应该更新您的数据库。


Tej*_*ank 6

我们也面临类似的问题,我在本地检查了删除blank=true,null=true 是否有效,但在生产服务器中它运行不佳。

比应用程序中出现问题的文件,它们的迁移文件夹,我删除了所有文件,然后

python manage.py makemigrations
Run Code Online (Sandbox Code Playgroud)

python manage.py migration
Run Code Online (Sandbox Code Playgroud)

两者都有效,而且 runserver 也运行良好。


小智 6

如果你在模型中添加了一个字段(或者修改了一个字段),那么当你迁移时,Django将查找以前的记录并检查它们是否满足为该字段指定的约束。

在您的情况下,即使您允许null = True使用 ImageField,当 Django 尝试将该列添加到数据库时,它会发现该字段的值尚未为以前的记录定义。

解决方案:您必须default = None在 ImageField 中添加,这将为以前的记录生成值NULL

此外, 当 Django 运行迁移时,即使您指定了迁移编号(例如,python manage.py migrate your_app_name 00xx),它也会检查先前迁移中的依赖关系。现在,由于您在此处进行的迁移导致了错误,即使您更正它(如给定的)并尝试迁移,它仍然会导致相同的错误。

因此,您需要删除所有先前的迁移,直到第一个导致错误的迁移,然后makemigrations再次运行。然后就可以migrate毫无问题地运行了。


Kro*_*mir 5

只需删除您的基础并进行迁移即可

  • 你能解释一下如何删除基地吗? (3认同)

小智 5

转到项目的迁移文件夹并删除由于该原因创建的迁移文件command: python manage.py makemigrations 并重新运行相同的命令,然后运行:

python manage.py migrate
Run Code Online (Sandbox Code Playgroud)