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