Django在不同的字段中注册两种不同类型的用户

时间:2019-03-20 14:39:29

标签: django django-models django-users

我想创建两个用户:patientdoctor。两个用户将共享一些标准字段,例如first_namelast_name等。但是,他们应该具有不同的字段。例如,只有doctor具有expertisedays_available之类的字段。

我复习了一个类似的问题,但它并没有完全满足我的具体需求。我不一定需要自定义权限/身份验证,因为我只需要为每个用户使用单独的字段即可。我尝试了最后一种方法,扩展了用户模型,但是当我创建用户时,它并没有链接到患者/医生。我必须手动创建医生并将其链接到用户。 创建用户后如何自动创建医生/患者?

class User(AbstractUser):
    is_doctor = models.BooleanField(default=False)
    is_patient = models.BooleanField(default=False)

class Patient(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    user.is_patient = True
    pid = models.AutoField(unique=True, primary_key=True) #patient identification

class Doctor(models.Model):
    upin = models.AutoField(primary_key=True) #unique physician identification number
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    user.is_doctor = True
    expertise = models.CharField(max_length=20)
    days_available = models.DateTimeField(null=True)

2 个答案:

答案 0 :(得分:2)

签出this blog post-具体来说是第二个选项:“使用一对一链接扩展用户模型。”作者建议使用信号在创建/更新用户对象时自动执行操作。也许尝试这样的事情:

class User(AbstractUser):
    is_doctor = models.BooleanField(default=False)
    is_patient = models.BooleanField(default=False)

class Patient(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    user.is_patient = True
    pid = models.AutoField(unique=True, primary_key=True) #patient identification

class Doctor(models.Model):
    upin = models.AutoField(primary_key=True) #unique physician identification number
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    user.is_doctor = True
    expertise = models.CharField(max_length=20)
    days_available = models.DateTimeField(null=True)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        if instance.is_patient:
            Patient.objects.create(user=instance)
        elif instance.is_doctor:
            Doctor.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    if instance.is_patient:
        instance.patient.save()
    elif instance.is_doctor:
        instance.doctor.save()

答案 1 :(得分:1)

您的log.getEvents()模型默认情况下将User设置为objects。您应该重写该方法:

auth.models.UserManager