Нулевое значение в столбце ... нарушает ограничение 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)