Единственное решение, о котором я могу подумать, - это на самом деле изменить модель 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__