【问题标题】:How to have multiple AUTH_USER_MODEL in django如何在 django 中有多个 AUTH_USER_MODEL
【发布时间】:2021-01-22 09:55:43
【问题描述】:

我有两个不同的应用程序,它们具有从 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

【问题讨论】:

  • 你没有。你有 一个 User 模型。您可以使用ForeignKey 为用户模型制作多个额外的模型。

标签: python django django-models django-auth-models


【解决方案1】:

我怎样才能拥有多个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

这也允许User 既是Doctor 又是Patient。起初这可能看起来很奇怪。但是以后有可能你引入更多的角色,也不是不可能给同一个用户分配多个角色,例如一个部门的doctorsupervisor。 p>

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 1970-01-01
    • 2015-07-28
    • 2013-10-15
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多