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

时间:2017-03-11 08:48:04

标签: python django django-models sqlite imagefield

我想将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'

11 个答案:

答案 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)

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