бэкэнд аутентификации django - PullRequest
       0

бэкэнд аутентификации django

0 голосов
/ 07 февраля 2011

Я следовал методу расширения класса User для реализации пользовательских приложений в моем приложении.

Как упомянуто в ссылке, необходимо написать пользовательский сервер аутентификации для возвратасоответствующий пользовательский класс пользователя, а не пользователь.

Однако у меня есть несколько пользовательских классов пользователей, а именно: ученик, учитель, родитель.

Есть ли лучший способ, чем проверка Student-> Teacher->Родительские таблицы для возврата правильного пользовательского пользователя?

1 Ответ

1 голос
/ 07 февраля 2011

Единственное решение, о котором я могу подумать, - это на самом деле изменить модель User, которую использует django, и добавить поле content_type, которое сообщит вам, какой тип пользователя является действительным объектом пользователя. Тогда вы можете напрямую запросить это. Вам все равно понадобится 2 запроса каждый раз, чтобы получить правильный объект пользователя.

В качестве альтернативы у вас может быть модель, которая наследуется от пользователя, которая включает в себя все функциональные возможности, требуемые вашими тремя классами, например, называется SuperUser со специальным полем, определяющим, является ли он учащимся, учителем или родителем.

Затем извлеките объект SuperUser для пользователя, содержащий все необходимые данные. Используя специальное поле, определяющее тип пользователя, вы можете иметь модель прокси, которую вы используете для каждого типа пользователя (ProxyStudent, ProxyTeacher и т. Д.), Которая будет вести себя так, как следует.

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

class SuperUser(User):
  type = models.IntegerField(choices=[(0, 'Student'), (1, 'Teacher'), (2, 'Parent')]
  # insert all the data for all 3 seperate classes here

class ProxyStudent(SuperUser):
  class Meta:
    proxy = True

  def special_student_method(self):
    pass


fetch request.user
and make request.user an instance of SuperUser


student = ProxyStudent()
student.__dict__ = request.user.__dict__
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...