2016-10-26 4 views
0

Использование Django у нас есть два типа пользователей (преподавателей и студентов) с общими полями и необычных полейMultiple Тип пользователя с Django

В нашем мастере мы первый POST общие поля для/пользователей с дополнительной type_field Каждая операция после этого должен быть в состоянии выяснить, какую модель (Учитель или Студент) она должна использовать.

Мы думаем о создании двух моделей (учитель и ученик) с полем «один к одному».

Но как мы подключаем type_field вправо. Модель на каждой операции?

+0

Вы имеете в виду, что вы используете 'type_field' для разграничения между объектами ученика и учителя? (с параметром 'type_field', переданным вашей формой в'/users') – ettanany

+0

При первом создании пользователя мы просим их выбрать там тип и заполнить основные элементы, такие как имя и адрес электронной почты, которые будут вписываться в модель пользователя Django. Но вся операция после этого должна захватить правый профиль пользователя USER, чтобы попросить их заполнить необычные поля. – user3411864

+0

. Пожалуйста, взгляните на приведенный ниже ответ и сообщите мне, подходит ли оно вам. – ettanany

ответ

0

Вы можете использовать что-то вроде:

class Person(models.Model): 
    first_name = models.CharField(max_length=255) 
    last_name = models.CharField(max_length=255) 
    # more common fields 

class Student(Person): 
    specific_field_to_student = models.CharField(max_length=255) 
    # more fields 


class Teacher(Person): 
    specific_field_to_teacher = models.CharField(max_length=255) 
    # more fields 

В базе данных вы будете иметь 3 таблицы (yourapp_person, yourapp_student и yourapp_teacher). Теперь, если type_field значение student, вы будете использовать модель Student, чтобы создать пользователя, если это учитель, вы будете использовать модель Teacher.

Примечание: Вам может понадобиться сделать Person модель выше подкласс встроенного User модели.

Edit:

я редактировал модель выше, чтобы принять во внимание требования в комментариях ниже.

Теперь, чтобы получить пользователя по идентификатору, вы можете использовать следующий код на ваш взгляд:

user = Person.objects.get(id=id) # id is the view param 
if hasattr(user, 'student'): 
    print("Student") 
else: # hasattr(user, 'teacher') 
    print("Teacher") 
+0

Хорошо, что имеет смысл, но как вы делаете выбор, если я, например, прошу GET/users/4. Это то, что вы вкладываете в сериализатор или создаете промежуточное ПО? – user3411864

+0

У вас нет дополнительной информации, отправленной с вашим запросом, чтобы узнать тип объекта (студент или преподаватель)? – ettanany

+0

@ user3411864 Посмотрите на править выше – ettanany

0

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

from django.contrib.auth.models import User 

class Teacher(User): 
    extra_field_1 = models.Fieldtype() 
    ... 
    ... 

class Student(User): 
    extra_field_1 = models.Fieldtype() 
    ... 
    ... 

Вы можете обеспечить оба типа пользователей же форму регистрации и при нажатии следующего взять их на следующую страницу в зависимости от значения Я поле учителя/ученика. В этом случае я предлагаю вам использовать atomic blocks, если вы не хотите сохранять данные в случае, если процедура регистрации не срабатывает в какой-то момент, или пользователь выбрал неправильный выбор, и они хотят вернуться. По этому подходу унаследованные модели имеют username, first_name, last_name and email, что вам не нужно вставлять какие-либо из них в модель Учителя или ученика. Затем вам нужно создать forms для каждой модели. Вы можете использовать modelform. Более подходящий подход будет использовать class based views, поскольку это уменьшает количество кода и придерживается принципов dry.

+0

Но как узнать, какую модель использовать, когда я запрашиваю пользователя/пользователя GET, например? – user3411864

+0

вместо/user/{id}, используйте '/ teacher/{id}'. Если вам необходимо использовать/usr/{id}, вам нужно получить объект-учитель со ссылкой из пользовательского объекта. Может быть, это похоже на 'if teacher.user.id == user.id:'. – cutteeth

+0

Хорошо, если пользователь входит в систему, вы не знаете, является ли он студентом или преподавателем, поэтому использовать общий/user/{id} является единственным вариантом? – user3411864