2011-02-07 2 views
0

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

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

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

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

ответ

1

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

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

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

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

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__ 
+0

Прокси-метод выглядит интересным, но как я могу реализовать классы, например, для Учителя? – goh

+0

Вам нужно будет добавить их в модель SuperUser, а затем оставить их пустыми при использовании StudentProxy или ParentProxy и только добавить значение для них при использовании TeacherProxy. Очевидно, это означает избыточные данные, но это означает, что у вас хорошая производительность, потому что у вас всегда будет правильный экземпляр пользователя (или, вернее, он сможет «придать» его экземпляру правильного типа через поле «тип» класса SuperUser). –

+0

Было бы лучше реализовать собственный сервер auth, который возвращает пользователя-прокси, а не взламывает его, изменяя '__dict__' – aehlke