Это невозможно без абстракции, и вот почему: LongNamedRestaurant
также является 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
), которая включает в себя немало дублирования кода, если вам нужно только изменить поле электронной почты. В качестве альтернативы вы можете оставить письмо как есть и убедиться, что оно требуется во всех формах. Это не гарантирует целостность базы данных, если ее используют другие приложения, и не работает наоборот (если вы хотите, чтобы имя пользователя не требовалось).