Как сделать несколько типов пользователей в Django 1.7?

Привет.
Как правильнее всего в Django сделать поддержку нескольких типов пользователей?
Возьмем абстрактый пример Teachers & Students
Каждый тип пользователей должен иметь свой собственный профайл и дашборд, логин и регистрацию.
Пользователь одновременно не может быть Teacher'ом и Student'ом

смотреть в сторону AbstractUser?
  • Вопрос задан
  • 3988 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Singularity
Да. Еще BoolField или https://docs.djangoproject.com/en/1.7/ref/forms/fi...

В джанге должна быть обезатально только одна модель для пользователя. Все прибито гвоздями-плохая архитектура.

Eсли у них силько разные поля в модели то прийдеться сделать два ModelForm и их использовать.
Ответ написан
Комментировать
abukin
@abukin
Программирую на Python
Через AbstractBaseUser можно сделать свою модель пользователей и расширить её. А так же можно отнаследоваться от созданной модели и сделать отдельно модель с профилями пользователей где городить всё что вздумается. Не все прибито гвоздями.

Разумнее все же делать не models.BooleanField а models.IntegerField с choices. Вдруг вы в будущем захотите расширить значения и добавить ещё типов пользователей.
Ответ написан
В принципе в джанге можно все. Вопрос в том как хочется организовать хранение этих данных в бд.

Навскидку 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 бекенде можно делать запрос и возвращать нужный класс. Получается две таблички, две модели никак не связанных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы