Нулевое значение в столбце ... нарушает ограничение not-null

Переполнение стека.

У меня есть приложение Django, которое управляет списками товаров и тегами (категориями). Они связаны с полем ManyToMany на модели Item. Следующий код представляет собой соответствующий код из моделей

В качестве базы данных я использую PostgreSQL.

#models.py

class Tag(models.Model):
    title = models.CharField(max_length=300, unique=True)
    slug = models.SlugField(max_length=300, blank=True, null=True, unique=True)
    objects = TagManager()

    def generate_token(self):
        self.slug = get_random_string(length=15)
        return self.slug

    def save(self, *args, **kwargs):
        if self.slug is None:
            self.generate_token()
        super().save(*args, **kwargs)

И модель Item

class Item(models.Model):
    seller = models.ForeignKey(User,related_name='seller', on_delete=models.CASCADE)
    
    #the following lines are the problem lines
    tag = models.ManyToManyField(Tag, related_name='tag', blank=True) 
    slug = models.SlugField(max_length=30, blank=True, null=True, unique=True)

    objects = ItemManager()

    def generate_token(self):
        self.slug = get_random_string(length=15)
        return self.slug

    def save(self, *args, **kwargs):
        if self.slug is None:
            self.generate_token()
        super().save(*args, **kwargs)

Этот код работал нормально, пока я не попробовал добавить элемент со страницы Django Admin. Я заполнил все поля, добавил два тега из меню <select> и попытался сохранить его.

Однако меня встретило следующее сообщение об ошибке

null значение в столбце "tag_id" отношения "item_item" нарушает ограничение not-null

и

DETAIL: Неудачная строка содержит (18, Название товара здесь, Это описание, 40.00, items/pattern.png, lXBjgo70QIrI8aF, 1, null).

Это полный отслеживание

Извините за все блоки кода/ошибки

Что я пробовал

Я перепробовал множество способов избавиться от этой ошибки, но ничего не помогло.

  • Удалены миграции
  • Добавил, удалил, прочитал null=True на полях slug обеих моделей
  • Сделал то же самое для blank=True

Ни один из этих способов не сработал. Я искал в Интернете готовое решение, но они привели меня только к добавлению null=True на мои поля, которые у меня уже есть.

Я очень озадачен тем, почему возникает эта ошибка.

tag_id выделяется, так как я предполагаю, что ошибка not-null связана с этим, и я предполагал, что id присваиваются при создании объекта.

Заранее благодарю

Думаю, проблема в том, что вы не передаете класс модели и self в метод super

Изменить методы сохранения

super(Tag, self).save(*args, **kwargs)
super(Item, self).save(*args, **kwargs)

Моим решением было просто определить tag_id в модели Item. Код для интересующихся приведен ниже

tag_id = models.IntegerField(default=1, editable=False)

Я немного беспокоюсь о перспективности этого, но на данный момент это работает. Я обновлю этот ответ, если возникнет какая-либо другая проблема

добавьте атрибут null=True для поля tag модели Item следующим образом

tag = models.ManyToManyField(Tag, related_name='tag', blank=True, null=True)
Вернуться на верх