我想将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)
在database_forwards中的文件“C:\ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ migrations \ operations \ _ fields.py”,第84行 领域, 在add_field中输入文件“C:\ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ backends \ sqlite3 \ schema.py”,第231行 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行,执行 return super(CursorDebugWrapper,self).execute(sql,params) 执行文件“C:\ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ backends \ utils.py”,第64行 return 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行,重新加载 提高value.with_traceback(tb) 执行文件“C:\ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ backends \ utils.py”,第64行 return self.cursor.execute(sql,params) 文件“C:\ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ backends \ sqlite3 \ base.py”,第337行,执行中 返回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'
答案 0 :(得分:3)
你有没有运行 makemigrations appname ?
NOT NULL约束失败
此错误通常表示未提供所需的字段,但我可以看到您在图片字段中设置了 blank = True和null = True 属性。
答案 1 :(得分:1)
只需删除您的基地并将您的应用迁移到您的应用
答案 2 :(得分:1)
我们也面临类似的问题,我在本地检查时删除了 blank = true,null = true ,但在生产服务器中它运行不正常。
比在问题引发的app中的文件,他们的迁移文件夹,我删除了所有文件然后
python manage.py makemigrations
和
python manage.py migration
工作和运行服务器都运行良好。
答案 3 :(得分:1)
转到migrations文件夹并手动删除名称类型为000 * _lastAction_blah-blah的文件,您可以删除可能是所有文件,但可以删除0001_initial.py。在运行./manage.py进行迁移app_you_are_updateing之后,它应该更新您的数据库。
答案 4 :(得分:1)
如果您在模型中添加了一个字段(或修改了一个字段),则在迁移时,Django将查找以前的记录,并检查它们是否满足为该字段指定的约束。
在您的情况下,即使您为ImageField允许了null = True
,当Django尝试将该列添加到数据库时,它也会为先前的记录发现该字段的值“未定义”。
解决方案: :您必须在ImageField中添加default = None
,这将为以前的记录NULL
赋值。
此外,
当Django运行迁移时,即使您指定了迁移号(例如python manage.py migrate your_app_name 00xx
),它也会检查先前迁移中的依赖关系。现在,由于您在此处进行的迁移已引起错误,即使您进行了纠正(如给定)并尝试进行迁移,它仍然会导致相同的错误。
因此,您需要删除所有先前的迁移,直到最先导致错误的迁移,然后再次运行makemigrations
。然后,您可以毫无问题地运行migrate
。
答案 5 :(得分:0)
转到项目的迁移文件夹,然后删除由于command: python manage.py makemigrations
而创建的迁移文件
并重新运行相同的命令,然后运行:
python manage.py migrate
答案 6 :(得分:0)
只需转到migrations文件夹,删除所有.py文件,然后再次运行命令“ python manage.py makemigrations和python manage.py migration”。
答案 7 :(得分:0)
如果您以前在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']
当我未添加“作者”字段时,我也遇到了同样的错误。
答案 8 :(得分:0)
我知道您发表此书已有很长时间了,也许您有更多的经验,但是只要您执行./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
,这样就可以解决您的问题,而不必说我会慢慢退出。
哦,如果您做了所有这些却没有任何结果,那是因为您必须创建一个超级用户,如果您不知道,则只需转到终端并放置if self.training:
# it's in train mode
else:
# it's in eval mode
,即可创建该用户然后你去重复已经说过的话,我想我会很放松。
答案 9 :(得分:0)
我有同样的错误信息:
"django.db.utils.IntegrityError: NOT NULL constraint failed: appName_modelName.model_field_id"
我删除了迁移文件和数据库,但没有成功。原来我忘记在forms.py
答案 10 :(得分:-1)
基本上,如果您在模型类中进行了更改,则需要删除之前创建的所有对象,因为它们具有旧的属性。