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 之外的所有迁移,然后删除了数据库。
之后只需进行迁移和迁移,一切都应该没问题
我想将 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
有同样的问题。 我删除了除 init.py 之外的所有迁移,然后删除了数据库。 之后只需进行迁移和迁移,一切都应该没问题