django.db.utils.IntegrityError: Ошибка ограничения NOT NULL: products_product.image ОШИБКА С ПОЛЕМ ИЗОБРАЖЕНИЯ

Я хочу добавить поле изображения в свой 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)

Файл "C: \ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ migrations \ operations \ fields.py", строка 84, в поле database_forwards, файл "C: \ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ backends \ sqlite3 \ schema.py ", строка 231, в add_field 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, в файле execute 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) File" C: \ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ db \ backends \ utils.py ", строка 64, при выполнении return self.cursor.execute (sql, params) Файл" C: \ Users \ PANDEMIC \ Desk top \ td10 \ lib \ site-packages \ django \ db \ utils.py ", строка 94, в exit six.reraise (dj_exc_type, dj_exc_value, traceback) Файл" C: \ Users \ PANDEMIC \ Desktop \ td10 \ lib \ site-packages \ django \ utils \ six.py ", строка 685, при повторном повышении значения повышения. С_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, при выполнении return 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'

person Kronvid Vladimir    schedule 11.03.2017    source источник


Ответы (11)


Перейдите в папку миграции и удалите вручную файлы с типом имени 000 * _lastAction_blah-blah, вы можете удалить, наверное, все, кроме файла 0001_initial.py. После этого запустите ./manage.py, сделайте миграции app_you_are_updateing, он должен обновить вашу базу данных.

person Nomad Owl    schedule 10.01.2019

Вы уже выполнили makemigrations appname?

Ошибка ограничения NOT NULL

Эта ошибка обычно означает, что обязательное поле не было предоставлено, но я вижу, что вы установили атрибуты blank = True и null = True в поле изображения.

person Gerry Hernandez    schedule 11.03.2017
comment
Это действительно поможет - person Tanvir Islam Streame; 17.02.2020

нужно просто удалить свою базу и перенести ваше приложение

person Kronvid Vladimir    schedule 11.03.2017
comment
Миграций делать не нужно. - person Sören; 09.11.2018
comment
не могли бы вы объяснить, как удалить базу? - person Thomas; 27.06.2020

Мы тоже сталкиваемся с подобными проблемами, я локально проверил, удалив blank = true, null = true, работает, но на рабочем сервере это не сработало.

Чем файлы внутри приложения, где возникает проблема, их папка миграции, я удалил все файлы, а затем

python manage.py makemigrations

а также

python manage.py migration

Оба работали, и также хорошо работает runserver.

person Tejas Tank    schedule 29.09.2017

Перейдите в папку миграции вашего проекта и удалите файл миграции, созданный из-за command: python manage.py makemigrations, и повторно выполните ту же команду, а затем выполните:

python manage.py migrate
person Community    schedule 08.03.2019

Если вы добавили поле в модель (или изменили поле), при миграции Django будет искать предыдущие записи и проверять, соответствуют ли они ограничениям, заданным для поля.

В вашем случае, даже если вы разрешили null = True для ImageField, когда Django пытается добавить этот столбец в базу данных, он обнаруживает, что значение для этого поля «не определено» для предыдущих записей.

Решение: вам нужно добавить default = None в ImageField, что сделает значения для предыдущих записей NULL.

Более того, когда Django выполняет миграции, даже если вы указываете номер миграции (например, python manage.py migrate your_app_name 00xx), он проверяет зависимости в предыдущих миграциях. Теперь, когда миграция, которую вы здесь сделали, вызвала ошибку, даже если вы исправите ее (как указано) и попытаетесь выполнить миграцию, она все равно вызовет ту же ошибку.

Следовательно, вам необходимо удалить все предыдущие миграции, вплоть до той, которая первой вызвала ошибку, и снова запустить makemigrations. Тогда вы сможете без проблем запустить migrate.

person dee    schedule 31.03.2020

В основном, если вы внесли изменения в свой класс модели, вам необходимо удалить все объекты, созданные ранее, поскольку они имеют старые атрибуты.

person siddhant    schedule 15.08.2018
comment
Нет, к счастью, есть команда makemigrations для обновления объекта :) - person Antoine Draune; 21.11.2018

Просто перейдите в папку миграции, удалите все файлы .py, а затем снова выполните команду python manage.py makemigrations и python manage.py migrate.

person Hardeep Chhabra    schedule 12.07.2020
comment
Обнуление всех миграций - не очень хорошее решение, не так ли? - person Chris; 13.07.2020
comment
По-видимому, это единственное решение для устранения ошибок такого типа. И это совсем не плохо, потому что, как уже известно, миграции создаются автоматически каждый раз, когда мы вносим изменения в базу данных. Так что никакой разницы это не вызовет. - person Hardeep Chhabra; 05.08.2020

Если вы ранее создавали форму в 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']

Я получил ту же ошибку, когда не добавил поле «автор».

person Ayse    schedule 15.10.2020

Я знаю, что прошло много времени с тех пор, как вы опубликовали это, и, возможно, у вас больше опыта, но ваша проблема была бы решена быстро, если бы вы только сделали ./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, вы создаете пользователя, а после этого вы идете и повторяете то, что уже было сказано, и я думаю, что с этим я был бы супер расслаблен.

person Rookie    schedule 17.12.2020

У меня было такое же сообщение об ошибке: "django.db.utils.IntegrityError: NOT NULL constraint failed: appName_modelName.model_field_id" Я удалил файлы миграции и БД, но безуспешно. Оказалось, что я забыл добавить один заполненный в класс формы в forms.py

person Paweł Błasiak    schedule 14.04.2021