Я бьюсь с этим уже пару дней. django.contrib.auth.models имеет модель User, которая разрешает несколько разрешений, но затем имеет 3 флага для is_staff, is_superuser и is_active.
is_staff = models.BooleanField(_('staff status'), default=False, help_text=_('Designates whether the user can log into this admin site.'))
is_active = models.BooleanField(_('active'), default=True, help_text=_('Designates whether this user should be treated as active. Unselect this instead of deleting accounts.'))
is_superuser = models.BooleanField(_('superuser status'), default=False, help_text=_('Designates that this user has all permissions without explicitly assigning them.'))
groups = models.ManyToManyField(Group, verbose_name=_('groups'), blank=True, help_text=_('The groups this user belongs to. A user will get all permissions granted to each of his/her group.'))
user_permissions = models.ManyToManyField(Permission, verbose_name=_('user permissions'), blank=True, help_text='Specific permissions for this user.')
Чего я не могу понять, так это почему is_staff и is_superuser не являются разрешениями, вы могли бы реализовать это таким же образом с примерно таким же объемом кода, но по какой-то причине они решили переместить эти два поля в логические значения в модели.
Часть причины, по которой я спрашиваю, заключается в том, что у меня похожая ситуация, в которой можно использовать третье логическое значение (или я могу сделать это с разрешением), и я пытаюсь понять, почему они отделяют эти два от разрешений?
Кажется, я понимаю, что is_active позволяет вам заблокировать кого-то без необходимости «исправлять» их разрешения, когда они возвращаются (хотя у вас может быть «разрешение» is_locked_out, но это звучит неправильно).
Решение проблемы
Я собираюсь угадать производительность. Проверка логического поля намного дешевле, чем получение разрешений, связанных с пользователем, из другой таблицы или выполнение соединений sql. Учитывая, что в некоторых случаях статус авторизации пользователей проверяется при каждом запросе, гораздо разумнее (хотя и не так чисто) поместить логические значения в пользовательскую модель и проверять их.
Комментариев нет:
Отправить комментарий