Nie jest to możliwe, chyba że jest abstrakcyjne, a oto dlaczego: LongNamedRestaurant
jest również a Place
, nie tylko jako klasa, ale także w bazie danych. Tabela miejsc zawiera wpisy dla wszystkich czystych Place
i dla wszystkich LongNamedRestaurant
. LongNamedRestaurant
po prostu tworzy dodatkową tabelę z food_type
i odniesieniem do tabeli miejsc.
Jeśli to zrobisz Place.objects.all()
, otrzymasz również każde miejsce, które jest LongNamedRestaurant
i będzie to wystąpienie Place
(bez food_type
). Więc Place.name
i LongNamedRestaurant.name
dzielić tę samą kolumnę bazy danych, a zatem musi być tego samego typu.
Myślę, że ma to sens w przypadku normalnych modeli: każda restauracja jest miejscem i powinna mieć przynajmniej wszystko, co ma to miejsce. Może ta spójność jest także powodem, dla którego nie było możliwe dla modeli abstrakcyjnych przed 1.10, chociaż nie spowodowałoby tam problemów z bazą danych. Jak zauważa @lampslave, stało się to możliwe w 1.10. Osobiście zalecałbym ostrożność: jeśli Sub.x zastępuje Super.x, upewnij się, że Sub.x jest podklasą Super.x, w przeciwnym razie Sub nie może być używany zamiast Super.x.
Obejście problemu : Możesz utworzyć niestandardowy model użytkownika ( AUTH_USER_MODEL
), który wiąże się z duplikacją kodu, jeśli potrzebujesz tylko zmienić pole adresu e-mail. Alternatywnie możesz zostawić wiadomość e-mail bez zmian i upewnić się, że jest wymagana we wszystkich formach. Nie gwarantuje to integralności bazy danych, jeśli używają jej inne aplikacje, i nie działa na odwrót (jeśli chcesz, aby nazwa użytkownika nie była wymagana).