Единственное решение, о котором я мог думать, это фактически изменить модель пользователя, которую использует 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__
Прокси-метод выглядит интересным, но как я могу реализовать классы, например, для Учителя? – goh
Вам нужно будет добавить их в модель SuperUser, а затем оставить их пустыми при использовании StudentProxy или ParentProxy и только добавить значение для них при использовании TeacherProxy. Очевидно, это означает избыточные данные, но это означает, что у вас хорошая производительность, потому что у вас всегда будет правильный экземпляр пользователя (или, вернее, он сможет «придать» его экземпляру правильного типа через поле «тип» класса SuperUser). –
Было бы лучше реализовать собственный сервер auth, который возвращает пользователя-прокси, а не взламывает его, изменяя '__dict__' – aehlke