django - Django用不同的字段注册两种不同类型的用户
问题描述
我想创建两个用户:patient
和doctor
. 两个用户将共享一些标准字段,例如first_name
,last_name
等。但是,他们应该有不同的字段。doctor
例如,只有 才会有 和 之expertise
类的字段days_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)
解决方案
查看这篇博文——特别是第二个选项:“使用一对一链接扩展用户模型”。作者建议在创建/更新用户对象时使用信号自动执行操作。也许尝试这样的事情:
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()
推荐阅读
- sql - 根据在一段时间内每天计数大于 1 的关联的行数生成直方图
- client - 如何防止 systemd-networkd 发送客户端标识符?
- linux - 在 Linux Mint 19 Tara 上安装 Virtualbox
- c# - 通过引用(远程)处理 EF 上下文,内存泄漏
- javascript - 使用 momentjs 在数组中获取前几年
- javascript - 控制 Javascript 选择器
- sql - 在日期之间排序日期顺序
- mysql - SELECT 语句导致锁定等待超时;尝试为 innodb 重新启动事务
- javascript - 什么叫非调用函数输出?
- angular - 使用 Angular 6 重定向到 Netlify 上的自定义成功页面