Django,User在应用程序中可以有多个角色,有3种类型的User

时间:2018-02-18 08:58:58

标签: python django django-models

作为标题,我有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

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

我是通过参考上述网站制作的。导演拥有医生并可以授权。

但我不知道如何给医生或导演一把钥匙。

如果我发表评论,我会收到错误。

我希望你能帮助我。

1 个答案:

答案 0 :(得分:1)

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

this post获取灵感。

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

e.g。

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))