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

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

我想将 imagefield 添加到我的 models.py 并上传到我的 media_cdn 目录 但是当我迁移到我的 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)

File "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", line 231, in add_field self._remake_table(model, create_fields=[field]) File "C:\Users\PANDEMIC\Desktop\td10\lib\site-packages\django\db\backends\sqlite3\schema.py", line 199, in _remake_table self.quote_name(model._meta.db_table), File "C:\Users\PANDEMIC\Desktop\td10\lib\site-packages\django\db\backends\base\schema.py", line 112, in execute cursor.execute(sql, params) File "C:\Users\PANDEMIC\Desktop\td10\lib\site-packages\django\db\backends\utils.py", line 79, in execute return super(CursorDebugWrapper, self).execute(sql, params) File "C:\Users\PANDEMIC\Desktop\td10\lib\site-packages\django\db\backends\utils.py", line 64, in execute return self.cursor.execute(sql, params) File "C:\Users\PANDEMIC\Desktop\td10\lib\site-packages\django\db\utils.py", line 94, in exit six.reraise(dj_exc_type, dj_exc_value, traceback) File "C:\Users\PANDEMIC\Desktop\td10\lib\site-packages\django\utils\six.py", line 685, in 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) File "C:\Users\PANDEMIC\Desktop\td10\lib\site-packages\django\db\backends\sqlite3\base.py", line 337, in execute return Database.Cursor.execute(self, query, params) django.db.utils.IntegrityError: NOT NULL constraint failed: 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'

你 运行 makemigrations appname 了吗?

NOT NULL constraint failed

此错误通常表示未提供所需的字段,但我可以看到您已在图像字段中设置了 blank=True 和 null=True 属性.

只需要删除您的基础并使迁移成为您的应用程序

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

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

python manage.py makemigrations

python manage.py migration

两者都有效,runserver 也很好。

基本上如果您对模型进行了更改class,您需要删除之前创建的所有对象,因为它们具有旧属性。

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

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

python manage.py migrate

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

在您的情况下,即使您允许 ImageField null = True,当 Django 尝试将该列添加到数据库时,它会发现该字段的值对于以前的记录具有 'not been defined' .

解决方法:你必须在ImageField中添加default = None,这将使之前记录的值NULL.

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

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

只需转到 migrations 文件夹,删除所有 .py 文件,然后再次 运行 命令 'python manage.py makemigrations and python manage.py migrate'。

如果之前在Django中创建过表单,可以查看表单关联的字段(fields = ['title', 'content', 'author']等),也许您还没有在模型中添加具有非空约束的字段。

models.py

class Task(models.Model):
    author = models.ForeignKey("auth.User", on_delete=models.CASCADE, verbose_name='Taskı Oluşturan')  # user
    title = models.CharField(max_length=150, verbose_name='Task Başlık')
    content = models.TextField(verbose_name='Task İçeriği')
    created_date = models.DateTimeField(auto_now_add=True, verbose_name='Task Oluşturulma Tarihi')  # o anki tarihi atar
    slug = models.SlugField(editable=False)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="task")
    tag = models.ManyToManyField(Tag, related_name="task", blank=True)

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Task, self).save(*args, **kwargs)

views.py 

@method_decorator(login_required(login_url='/user/login'), name="dispatch")
class CreateTaskView(CreateView):
    template_name = 'task/create_task.html'
    form_class = TaskCreationForm
    model = Task


    def get_success_url(self):
        return reverse('detail',kwargs={"pk":self.object.pk, "slug":self.object.slug})

  
    def form_valid(self, form):
        form.instance.user = self.request.user
        form.save()
    
        tags = self.request.POST.get("tag").split(",") 

        for tag in tags:
            current_tag = Tag.objects.filter(slug=slugify(tag))

            if current_tag.count() < 1:
                create_tag = Tag.objects.create(title=tag)
                form.instance.tag.add(create_tag)

            else:
                exist_tag = Tag.objects.get(slug=slugify(tag))
                form.instance.tag.add(exist_tag)

        return super(CreateTaskView, self).form_valid(form)

forms.py

class TaskCreationForm(forms.ModelForm):

    class Meta:
        model = Task

        widgets = {
            'title':forms.TextInput(attrs={'class':'form-control', 'placeholder':'Title'}),
            'content':forms.Textarea(attrs={'class':'form-control', 'placeholder':'Content Here'})

        }

        fields = ['author','title','category','content']

我没有添加 'author' 字段时遇到同样的错误。

我知道你发表这篇文章已经很久了,也许你有更多的经验,但你的问题会很快解决,如果你做一个./manage.py makemigrations,然后我将不得不留下这样的东西:

You are trying to add a non-nullable field 'user' to tweet 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
Select an option:

在你得到另一个之后你被放在哪里 1:

Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt

也放在了1的地方,准备好了就只做一个 ./manage.py migrate,这样你的问题就解决了,不用多说我慢慢退出。

哦,如果你做了所有这些但没有结果,那是因为你必须创建一个超级用户,如果你不知道,你只需转到终端并输入 ./manage.py createsuperuser,你就创建了用户,然后你去重复已经说过的话,我想这样我会非常放松。

我有同样的错误信息: "django.db.utils.IntegrityError: NOT NULL constraint failed: appName_modelName.model_field_id" 我删除了迁移文件和数据库,但没有成功。原来是我忘记在forms.py

中添加一个填入表格class

有同样的问题。 我删除了除 init.py 之外的所有迁移,然后删除了数据库。 之后只需进行迁移和迁移,一切都应该没问题