Как создать пользователей с разными типами полей в django?
как создать модели для разных типов пользователей с разными типами полей в django?
Предположим, у меня есть 2 пользователя: врачи и медсестры, и у врачей есть doctor_id и dept, помимо полей, общих для медсестер и врачей. Как тогда действовать?
Искал везде и почесал голову, может ли кто-нибудь дать мне знать, как к этому подойти?
Я пытался написать что-то подобное, но не получается.
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
USER_TYPE_CHOICES = (
(1, 'doctor'),
(2, 'nurse'),
)
user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES)
class DoctorProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
doctor_id = models.CharField(max_length=6)
dept = models.CharField(max_length=255, blank=False, null=False)
def __str__(self):
return self.user.username
class NurseProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
nurse_id = models.CharField(max_length=6)
def __str__(self):
return self.user.username
Если я правильно понимаю, вы хотите иметь две модели.
Если вы хотите добавить слой абстракции, вы можете сделать это:
class User(AbstractUser):
person_id = models.CharField(max_length=6)
def __str__(self):
return self.user.username
class NurseProfile(User):
user_type = (2, 'nurse')
class Meta:
proxy = True
class DoctorProfile(User):
user_type = (1, 'doctor')
dept = models.CharField(max_length=255)
В предыдущем примере использовался прокси для Nurse, потому что вы можете сохранить четкую логику Nurse/Doctor и абстрактный-User-layer в виде таблицы в db. На мой взгляд, user_type вообще не нужен, но я оставил его в примере.
Если вам не нужен дополнительный пользователь, вы можете использовать простое наследование:
class NurseProfile(AbstraxctUser):
user_type = (2, 'nurse')
person_id = models.CharField(max_length=6)
def __str__(self):
return self.user.username
class DoctorProfile(NurseProfile):
user_type = (1, 'doctor')
dept = models.CharField(max_length=255)
Конечно, вы получаете новый вопрос о том, как собрать врача и медсестру из базы данных.
Обычный метод заключается в определении собственного объекта Profile
со ссылкой OneToOne на объект User
:
class Profile( models.Model)
user = models.ForeignKey( User, ...
# and any other fields you want
Профили содержат набор общих полей. У вас может быть поле выбора, которое представляет собой Doctor или Nurse, и поле doctor_id, которое является null (или нулем, или пустым) для медсестры.
Тогда вы можете обратиться к (например) self.request.user.profile.fieldname
Обратите внимание, что пока вы не убедитесь, что профиль для пользователя существует, ваша программа будет выдавать ошибку NotFound
, когда вы это сделаете. Простым исправлением является создание пустого профиля в представлении после входа в систему, если hasattr( user, 'profile
) равно False. Или в контексте create-user, если эта информация не является редактируемой пользователем.