Це неможливо, якщо не абстрактно, і ось чому: LongNamedRestaurant
є також a Place
, не тільки як клас, але і в базі даних. Таблиця місць містить запис для кожного чистого Place
та для кожного LongNamedRestaurant
. LongNamedRestaurant
просто створює додаткову таблицю з таблицею food_type
та посиланням на таблицю місць.
Якщо ви це зробите Place.objects.all()
, ви також отримаєте кожне місце, яке є LongNamedRestaurant
, і це буде екземпляр Place
(без цього food_type
). Отже, спільно використовуйте один Place.name
і LongNamedRestaurant.name
той же стовпець бази даних, і тому вони повинні бути одного типу.
Я думаю, що це має сенс для нормальних моделей: кожен ресторан - це місце, і він повинен мати принаймні все, що має місце. Можливо, ця послідовність також є причиною того, що до 1.10 абстрактні моделі не були можливими, хоча там не було б проблем із базами даних. Як зауважує @lampslave, це стало можливим у 1.10. Я особисто рекомендую доглядати: якщо Sub.x замінює Super.x, переконайтесь, що Sub.x є підкласом Super.x, інакше Sub не може бути використаний замість Super.
Обхідні шляхи : Ви можете створити власну модель користувача ( AUTH_USER_MODEL
), яка передбачає досить багато дублювання коду, якщо вам потрібно лише змінити поле електронної пошти. Ви також можете залишити електронний лист таким, який він є, і переконатися, що він потрібен у всіх формах. Це не гарантує цілісність бази даних, якщо інші програми використовують її, і не працює навпаки (якщо ви хочете зробити ім'я користувача не обов’язковим).