Как я могу наследовать два класса в 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
Вот как я могу воспроизвести ошибку:
- Создайте модель
BillingCompanyBankAccount(models.Model)
. Сначала она должна наследоваться отmodels.Model
. - Добавьте несколько
BillingCompanyBankAccount
экземпляров. - Затем напишите
BillingCompanyBankAccount(BankAccount)
и попытайтесь перенести существующую схему.
Вот почему происходит ошибка:
- Django ORM читает
BillingCompanyBankAccount(BankAccount)
, пытается добавить поле внешнего ключа к таблице банковского счета. - Это поле внешнего ключа не содержит значения по умолчанию.
- Django не знает, как добавить поле без значения по умолчанию в таблицу с существующими строками.
Вот что можно с этим сделать:
- Переместите строки в существующую таблицу/удалите существующую базу данных и запустите миграции заново. Это будет работать нормально, пока нет ценных данных, поэтому это можно делать во время разработки.
- Если вам важны данные и вы не хотите их удалять, вы можете либо
- Отредактировать файл миграции и добавить туда значение по умолчанию для внешнего ключа.
- Вместо того, чтобы писать
BillingCompanyBankAccount(BankAccount)
, вы можете явно объявить внешний ключ без наследования. После того, как вы объявили внешний ключ самостоятельно, обратитесь к этому вопросу о том, как добавить его в существующую модель и избежать потери данных: как добавить внешний ключ к существующему классу в django.