Nullable field default value django models in inhertiance
У меня есть модель продукта и другая модель под названием Курс, которая наследует продукт, но имеет поле видео и автора, который является ForeignKey с моделью учителя, которая наследуется от модели пользователя, которая наследуется от AbstractUser
Сопутствующие модели:
class User(AbstractUser):
username = models.SlugField(default="", null=False, db_index=True, blank=True) # forced by django admin problems :(
password = models.CharField(max_length=255, null=True)
email = models.EmailField(max_length=255, unique=True)
group = models.ManyToManyField(Group)
is_teacher = models.BooleanField(default=False, null=False)
is_seller = models.BooleanField(default=False, null=False)
phoneNum = PhoneNumberField(null=False, unique=True, default='')
USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["username", "first_name", "last_name", "password"]
def save(self, *args, **kwargs):
self.username = slugify(self.first_name + self.last_name)
super().save(*args, **kwargs)
class Product(models.Model):
name = models.CharField(max_length=100, null=False, blank=True)
shoppers = models.ManyToManyField(User, related_name='shopper')
tumb = models.ImageField(upload_to=course_tumb_directory_path, null=False)
lastUpdate = models.DateTimeField(auto_now=True)
price = models.DecimalField(null=False, default=1000000, max_digits=7, decimal_places=0)
class Teacher(User):
TOPICS = [
("BP", "Basic Programming"),
("AP", "Advanced Programming"),
("CS", "Computer Science"),
("MS", "Mathematics"),
("CH", "Chemistry"),
("BL", "BioLogy"),
("PH", "physics"),
("EL", "Electronics"),
("RG", "Religious"),
("Or", "Other"),
]
topic = models.CharField(max_length=2, choices=TOPICS, default=TOPICS[-1])
class Course(Product):
video = models.FileField(upload_to=course_directory_path, null=True,
validators=[
FileExtensionValidator(allowed_extensions=['MOV', 'avi', 'mp4', 'webm', 'mkv'])])
author = models.ForeignKey(Teacher, on_delete=models.CASCADE, null=True)
Когда я пытаюсь сделать миграции, он говорит следующее:
It is impossible to add a non-nullable field 'product_ptr' to course without specifying a default. This is because the database needs something to populate existing rows.
Я использую PostgreSQL для своей базы данных, она не позволила мне промыть ее, поэтому я удалил ее и создал новую. Но я все еще не могу сделать миграции
Я пробовал эти ответы:
Вы пытаетесь добавить ненулевое поле 'new_field' в userprofile без значения по умолчанию
.
Django: Вы пытаетесь добавить ненулевое поле 'slug' к посту без значения по умолчанию; мы не можем этого сделать
.
Невозможно добавить ненулевое поле 'id' к видео без указания значения по умолчанию
Вы пытаетесь добавить ненулевое поле 'id' в contact_info без указания default
.
Ошибка : "Вы пытаетесь добавить недействительное поле"
Я уже сталкивался с подобными ошибками, но я не смог понять одну вещь: она не связана с полем, поэтому я не могу ее исправить
Python: 3.10.6
Django: 4.1
PostgreSQL: psql 14.6
ОС: Ubuntu 22.04 (не VM)
Я понял, что большое количество повторяющихся наследований вызывает эту ошибку, не уверен почему, но это решает ее:
class BaseProduct(models.Model):
class Meta:
abstract = True
name = models.CharField(max_length=100, null=False, blank=True)
shoppers = models.ManyToManyField(User)
tumb = models.ImageField(upload_to=course_tumb_directory_path, null=False, blank=True)
lastUpdate = models.DateTimeField(auto_now=True)
price = models.DecimalField(null=False, default=1000000, max_digits=7, decimal_places=0)
class Product(BaseProduct):
count = models.DecimalField(null=False, default=1, max_digits=7, decimal_places=0)
class Course(BaseProduct):
video = models.FileField(upload_to=course_directory_path, null=True,
validators=[
FileExtensionValidator(allowed_extensions=['MOV', 'avi', 'mp4', 'webm', 'mkv'])])
author = models.ForeignKey(Teacher, on_delete=models.CASCADE, null=True, related_name='courses')
Наследование от абстрактной модели вместо повторяющегося наследования