Как я могу наследовать два класса в Django?

Я не могу использовать Abstract base class, потому что мне нужно использовать его как внешний ключ в другой модели. Когда я использую makemigrations, он выдает "вы пытаетесь добавить не нулевое поле 'base_ptr' в childa без значения по умолчанию". django-polymorphic пакет не изменяет результат.

class Base(models.Model):
     #some base fields

class ChildA(Base):
     #some extra fields

class ChildB(Base):
    #some extra fields

Вот как я могу воспроизвести ошибку:

  1. Создайте модель BillingCompanyBankAccount(models.Model). Сначала она должна наследоваться от models.Model.
  2. Добавьте несколько BillingCompanyBankAccount экземпляров.
  3. Затем напишите BillingCompanyBankAccount(BankAccount) и попытайтесь перенести существующую схему.

Вот почему происходит ошибка:

  1. Django ORM читает BillingCompanyBankAccount(BankAccount), пытается добавить поле внешнего ключа к таблице банковского счета.
  2. Это поле внешнего ключа не содержит значения по умолчанию.
  3. Django не знает, как добавить поле без значения по умолчанию в таблицу с существующими строками.

Вот что можно с этим сделать:

  1. Переместите строки в существующую таблицу/удалите существующую базу данных и запустите миграции заново. Это будет работать нормально, пока нет ценных данных, поэтому это можно делать во время разработки.
  2. Если вам важны данные и вы не хотите их удалять, вы можете либо
    1. Отредактировать файл миграции и добавить туда значение по умолчанию для внешнего ключа.
    2. Вместо того, чтобы писать BillingCompanyBankAccount(BankAccount), вы можете явно объявить внешний ключ без наследования. После того, как вы объявили внешний ключ самостоятельно, обратитесь к этому вопросу о том, как добавить его в существующую модель и избежать потери данных: как добавить внешний ключ к существующему классу в django.
Вернуться на верх