2

我有两个不同的应用程序,它们具有从 AbstractionBaseUser 继承的单独模型,如下所示

# in doctor/models.py
...

class Patient(AbstractBaseUser):
    email = models.EmailField(blank=True, unique=True)
    phone_number = models.IntegerField(blank=False, unique=True)
    
    USERNAME_FIELD = 'phone_number'
    REQUIRED_FIELD = ['phone_number', 'email']

...
# in Patient/models.py
...

class Patient(AbstractBaseUser):
    email = models.EmailField(blank=True, unique=True)
    phone_number = models.IntegerField(blank=False, unique=True)

    
    USERNAME_FIELD = 'phone_number'
    REQUIRED_FIELD = ['phone_number', 'email']

...

两种型号都有不同的领域

# in settings.py
AUTH_USER_MODEL = [
    'doctor.Doctor',
    'patient.Patient'
]

我试图这样做,但在进行迁移时它告诉我它必须是一个单一的模型

AssertionError: ForeignKey(['doctor.Doctor', 'patient.Patient']) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string 'self'

我阅读了文档,但找不到任何帮助

我该如何解决这个问题以及如何拥有多个 AUTH_USER_MODEL

4

1 回答 1

2

我怎么能有多个AUTH_USER_MODEL.

你没有。有一种用户模型。它还会使所有程序变得更加复杂。如果DoctorPatient模型中出现相同的电子邮件地址怎么办?那么你将如何登录这样的人?

ForeignKey但是,您可以使用用户模型制作多个额外的模型。例如,我们可以使用默认用户模型:

# settings.py

# …
AUTH_USER_MODEL = 'auth.User'
# …

你当然也可以自己指定一个基本的用户模型。但它应该是一种用户模型。

那么DoctorPatient模型都可以与模型具有一对一的关系User

from django.db import models
from django.conf import settings

class Doctor(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    # … extra doctor fields …

以及一位患者:

from django.db import models
from django.conf import settings

class Patient(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    # … extra patient fields …

.doctor然后,您可以通过访问属性来检查用户是否是医生:

from django.contrib.auth.decorators import login_required

@login_required
def some_view(request):
    try:
        doctor = request.user.doctor
    except AttributeError:
        # … user is not a doctor …
        pass
    pass

这也允许 aUser既是 aDoctor又是 aPatient例如。起初这可能看起来很奇怪。但是以后可能会引入更多的角色,也不是不可能为同一个用户分配多个角色,例如一个部门的医生主管

于 2020-10-07T13:07:51.213 回答