В принципе в джанге можно все. Вопрос в том как хочется организовать хранение этих данных в бд.
Навскидку 3 варианта:
а. Сэмулировать старый джанго user_profile(). Три таблички, три модели User/TeacherProfile/StudentProfile в модели user заводишь поле тип, в методе user.get_profile() проверять тип пользователя и возвращать нужный профиль
б. Одна общая таблица с большим количеством полей, три модели User/Teacher/Student. Teacher и Student являются прокси моделями для User. В модели пользователя по-прежнему есть поле тип, и с помощью небольшого
хака можно подменять класс на нужный в момент его создания.
с. Ну и самый сложный вариант. Три таблички, три модели User/Teacher/Student. Teacher и Student унаследованы от User. Поле тип можно делать, можно не делать. Суть хака в том чтобы подменить менеджер модели User, делая на любой запрос select_related(Student, Teacher) А при итерировании по объектам приводить тип к нужному заполняя поля из запроса. Для примера можно посмотреть
сюда или
сюда
UPDATE:
А еще если разнести ключи пользователей, прям сразу в auth бекенде можно делать запрос и возвращать нужный класс. Получается две таблички, две модели никак не связанных.