Лучший дизайн пользовательской модели Django

Возможно, некоторые из вас скажут, что это повторяющаяся тема, но после прочтения многих статей она все еще кажется мне очень неоднозначной. Мой вопрос касается наилучшего способа использования и расширения модели User с сохранением механизмов аутентификации (и других), доступных в Django. Однако я предпочитаю описывать свой дизайн:

  • Есть пользователи (пациенты), которые могут зарегистрироваться, указав основную информацию (имя, фамилию, дату рождения, пол, адрес электронной почты, пароль). Желательно, чтобы электронная почта заменяла имя пользователя.
  • Когда Пациент находится в приложении, он может зарегистрировать нового Пациента (представьте себе члена семьи), но адрес электронной почты и пароль не требуются, потому что они не будут входить в систему.

В первой части документа Django предлагается расширить User с помощью отношения OneToOne к профилю. Однако, чтобы заменить имя пользователя электронной почтой, они предлагают затем создать настраиваемого пользователя на основе AbstractUser, а также связанного с ним UserManager. Второе требование похоже на установление отношения «один ко многим» между пользователями. Итак, согласно Django, какая стратегия должна быть лучшей: создание полностью новой пользовательской модели и добавление особого атрибута пользователя-пользователя «один ко многим», который различает основных пользователей и членов семьи? ИЛИ расширить пользователя Django профилем, а затем профилем профиля отношения «один ко многим»? Какой вариант лучше всего сохраняет преимущества аутентификации пользователей Django и администрирования модели?

Спасибо за любой комментарий, предложение, пример.


person Ricardo A Corredor    schedule 30.11.2014    source источник
comment
Просто следуйте документации по электронной почте как имя пользователя. Если член семьи не входит в систему, это анонимный пользователь, а не настоящий пользователь. Просто создайте для них отдельную модель.   -  person allcaps    schedule 01.12.2014


Ответы (1)


Во-первых, если вы хотите использовать электронную почту в качестве имени пользователя, используйте функцию Django custom user. Это работает хорошо. Затем обратите внимание, что вы не можете расширить его с помощью профиля не потому, что вы создали своего собственного пользователя.

Итак, хорошим решением может быть:

  • Создайте пользовательского пользователя Django, не пытаясь добавить к нему определенные поля (единственная цель здесь - использовать электронную почту для входа в систему вместо имени пользователя).
  • Создайте PatientProfile класс, который имеет однозначное отношение (blank = True) с классом User.

Таким образом, пациент, который может войти в систему, будет связан с экземпляром пользователя и будет использовать этот экземпляр для этой цели. С другой стороны, пациент, который не может войти в систему, не будет связан ни с одним экземпляром User.

В конце концов, нет проблем использовать связь OneToMany с PatientProfile для того, что вы хотите делать.

person David D.    schedule 01.12.2014
comment
У меня есть связанный с этим вопрос. stackoverflow.com/questions/34213066/ Я думаю, что класс PatientProfile - хорошая альтернатива, хотя что вы думаете по этому поводу? Спасибо. - person bgarcial; 11.12.2015