【问题标题】:Django, User can have more than one role in the application, 3 types of UserDjango,用户在应用程序中可以有多个角色,3种类型的用户
【发布时间】:2018-07-28 17:32:53
【问题描述】:

作为标题,我有 3 种类型的用户,每个用户可以拥有多个角色。

from django.contrib.auth.models import AbstractUser, User
from django.db import models
from django.db.models import CASCADE
from hospital.models import Hospital

class Role(models.Model):
    '''
  The Role entries are managed by the system,
  automatically created via a Django data migration.
  '''
    DOCTOR = 1
    DIRECTOR = 2
    PATIENT = 3

    ROLE_CHOICES = (
        (DOCTOR, 'doctor'),
        (DIRECTOR, 'director'),
        (PATIENT, 'patient'),

    )

    id = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, primary_key=True)

    def __str__(self):
        return self.get_id_display()


class User(AbstractUser):
    roles = models.ManyToManyField(Role)

    def __str__(self):
        return self.roles


class Doctor(models.Model):
    # role = models.OneToOneField(User, on_delete=CASCADE)
    career = models.TextField(blank=True, max_length = 1000)

class Director(models.Model):
    # role = models.OneToOneField(User, on_delete=CASCADE)
    members = models.ManyToManyField(Doctor)

class Patient(models.Model):
    # personal information like above.

https://simpleisbetterthancomplex.com/tutorial/2018/01/18/how-to-implement-multiple-user-types-with-django.html

我正在创建一个模型,但我不知道如何设置密钥。

我是参考上述网站制作的。主任拥有医生,可以授权。

但我不知道如何将钥匙交给医生或主任。

如果我要评论,我会收到错误消息。

我希望你能帮助我。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    假设您要为 3 个派生类设置默认的 roles

    this post 中汲取灵感。

    由于roles 是多对多关系,您可以覆盖模型的save 方法(您也可以为此使用信号,但在您的情况下不建议这样做)。

    例如

    class Doctor(models.Model):
    
        def save(self, *args, **kwargs):
            if not self.id: # object creation
                should_add_role = True
            super(Doctor, self).save(*args, **kwargs) # do the usual
            if should_add_role: # add our defaults
                self.roles.add(Role.objects.get_or_create(id=Role.DOCTOR))
    

    【讨论】:

    • 感谢您的回复。但我不知道你的意图。你能更详细地解释一下吗?我应该在哪里调用保存功能? self 应该在哪里定义?
    • 您不必显式调用.save。我们正在覆盖默认行为以添加我们的自定义逻辑。该方法在模型类下定义(覆盖默认方法)。
    • 感谢您的回复。当我在用户模型中创建特定角色(例如医生)时,我想自动创建 DoctorProfile 模型实例。但我不知道该怎么做。很抱歉给您带来不便。
    • 我不明白你的意思。您想在何时何地创建模型实例?出于什么目的?
    • 对不起,我的解释不充分。当我自动制作用户模型实例时,如果我创建用户模型的实例,我想制作与该角色相对应的用户配置文件。 (例如,我创建了一个角色为医生的用户实例,自动创建医生档案实例)我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 2020-07-17
    • 2018-01-17
    • 1970-01-01
    • 2021-09-11
    • 2019-12-21
    • 2017-03-02
    • 2013-06-01
    相关资源
    最近更新 更多