Django 中特定用户类型的特定字段

问题描述

我正在尝试提出一种更好的结构来处理 django 应用程序中的用户数据。目前,应用中有两种用户,个人和组织。有特定于个人的数据和特定于组织的数据。例如,个人可以有名字和姓氏,而组织只有其组织名称

这是模型当前的样子

class CustomUser(AbstractUser):
    first_name = models.CharField(_('first name'),max_length=30,blank=True) # from AbstractUser
    last_name = models.CharField(_('last name'),max_length=150,blank=True) # from AbstractUser
    organization_name = models.CharField(_('organization name'),max_length=180,blank=True)
    is_individual = models.BooleanField(default=False)
    is_organization = models.BooleanField(default=False)

是否可以为特定用户类型设置特定字段?类似的东西:

Individual
-- first_name
-- last_name
# more data concerning individuals

Organization
-- organization_name
# more data concerning organizations

解决方法

使用一对一字段将组织和个人用户映射到实际用户模型。

class CustomUser(AbstractUser):
    is_individual = models.BooleanField(default=False)
    is_organization = models.BooleanField(default=False)

class OrganizationUser(models.Model):
    organization_name = models.CharField(_('organization name'),max_length=180,blank=True)
    user = models.OneToOneField(
        CustomUser,on_delete=models.CASCADE,primary_key=True,)

class IndividualUser(models.Model):
    first_name = models.CharField(_('first name'),max_length=30,blank=True) # from AbstractUser
    last_name = models.CharField(_('last name'),max_length=150,blank=True) # from AbstractUser
    user = models.OneToOneField(
        CustomUser,)
,

您可以为个人和组织创建 2 个不同的类

class User(Abstract):
    first_name = models.CharField(_('first name'),blank=True) # from AbstractUser
   

class Organization(Abstract):
    organization_name = models.CharField(_('organization name'),blank=True)
   

view.py 中,通过检查条件 is_individual / is_organization,您可以在数据库的相应表中存储和检索该详细信息。