Как создать пользователей с разными типами полей в 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, если эта информация не является редактируемой пользователем.

Вернуться на верх