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')

Наследование от абстрактной модели вместо повторяющегося наследования

Вернуться на верх