Джанго совет по дизайну модели - PullRequest
0 голосов
/ 19 марта 2019

В настоящее время я изучаю Django, в частности, DRF для создания API, который будет использоваться клиентом веб-приложения.Приложение для учителя, который дает внеклассные занятия по математике и естественным наукам.Моя основная идея заключается в том, что будет два типа пользователей: студент и учитель.Учителя, очевидно, будут иметь больше прав доступа, чем студенты.Проблема в том, что класс User django имеет атрибут is_admin, и, поскольку администратором сайта могут быть только Учителя, я не могу создать отдельный класс User, имеющий атрибуты is_admin и user_type.Например, пользователь с is_admin = True и user_type = Student будет недопустимой комбинацией.Моя идея состоит в том, чтобы сделать мой класс User абстрактным базовым классом, а затем создать два отдельных класса, Student и Teacher, которые наследуются от него.Это также идеально в том смысле, что только Учителя могут публиковать статьи, что означает, что у учеников просто не будет такого разрешения, но тогда я столкнусь с другой проблемой.Все пользователи имеют один профиль.В профиле будет храниться биография, изображение аватара пользователя и т. Д. Но при настройке отношения OneToOneField в профиле у профиля должны быть эти отношения со студентами и учителями, то есть со всеми типами пользователей.Как я могу установить эти отношения?Могу ли я сказать OneToOneField (Пользователь) и из-за наследства этот пользователь может быть Студентом или Учителем?Если нет, что мне делать?

Если у вас есть опыт, и вы думаете, с какой стати он (это я) это делает? Не стесняйтесь комментировать мой план дизайна и, пожалуйста, покажите мне, как это сделать.лучший дизайн будет выглядеть.Заранее спасибо.

РЕДАКТИРОВАТЬ: Есть ли преимущество в том, чтобы иметь одного профиля для каждого пользователя, сохранять биографию, изображение и т. Д.?Есть ли какая-то польза от сохранения этой информации в модели User?

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Не создавайте отдельные классы. То, что у них разные разрешения, не означает, что они должны быть разных классов! Все они могут быть User (или вашим собственным подклассом, но одинаковым).

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

Ваш код может затем использовать какое-то пользовательское разрешение (скажем, «опубликовать» разрешение на статью) и передать это разрешение группе учителей и проверить в своем коде, что текущий пользователь имеет это разрешение.

Обычно только один или несколько пользователей имеют «is_admin», is_admin означает, что у вас автоматически есть все существующие разрешения. Это для управления пользователями, настройки групп и тому подобного.

0 голосов
/ 19 марта 2019

Храните его как один класс, если вам не нужно, чтобы каждый класс имел разные атрибуты.Но в вашем случае вы можете просто сделать is_staff = True синонимичным как учитель, а затем вы можете избавиться от атрибута user_type.Обычно лучше использовать логические поля вместо полей с конечным набором вариантов, которые делают неизвестные вещи в коде.Таким образом, сотрудники будут учителями, а не сотрудники будут студентами.

В сторону: под "is_admin" вы имели в виду "is_staff", верно?Я не знаю, что модель пользователя django имеет атрибут «is_admin», только is_staff и is_superuser.

...