繁体   English   中英

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

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

我想将ImageField添加到我的Product model 并将其上传到我的media_cdn目录,但是当我将我的基础迁移到我的model.py时,它返回以下错误:

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

来自 cmd 的确切 output 是:

    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

这是我的models.py模块:

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'

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

你运行makemigrations appname了吗?

NOT NULL 约束失败

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

只需删除您的基础并迁移您的应用程序

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

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

python manage.py makemigrations

python manage.py migration

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

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

python manage.py migrate

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

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

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

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

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

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

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

如果之前在django中创建过表单,可以查看表单关联的字段(fields = ['title', 'content', 'author'] etc.),可能是你没有添加not null的字段模型中的约束。

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']

当我没有添加“作者”字段时,我遇到了同样的错误。

我知道你发表这篇文章已经很长时间了,也许你有更多的经验,但你的问题很快就会解决,只要你做一个./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的form类中添加一个forms.py

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

它也可能是保存 model 的实例而未指定必填字段的值的结果,例如:

class TestModel(models.Model):
    test1 = models.CharField(max_length=4)
    test2 = models.CharField(max_length=4)

在某处(可能在您的 views.py 中)保存了 model 而未指定某些值:

model = TestModel()
model.test1 = 'beer'
model.save()

通过 app_name 进行 makemigrations

所以这个问题将得到解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM