![](/img/trans.png)
[英]Createsuperuser django.db.utils.IntegrityError: NOT NULL constraint failed
[英]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.