Python 如何在Django中为我的应用程序定制一个自定义用户模型,同时保持管理员作为默认管理员工作?

Python 如何在Django中为我的应用程序定制一个自定义用户模型,同时保持管理员作为默认管理员工作?,python,django,Python,Django,以下是我试图实现的目标: -让管理员使用默认方式(用户名和密码)登录到管理员页面 -让用户使用使用电子邮件而不是密码的自定义用户模型注册/登录到我的web应用。它们还可以关联其他我的管理员不需要的数据 -将管理员帐户和用户帐户分离到不同的表中 我检查了如何通过扩展BaseUser来创建自定义用户类,但结果是我的管理员也成为了新的用户类型。那么,我可以为我的应用程序用户使用自定义用户模型,同时保持默认管理系统不变吗?或者我的设计有什么好的替代方案?经过几个多小时的挖掘,我认为最好保留一个单一用户

以下是我试图实现的目标:

-让管理员使用默认方式(用户名和密码)登录到管理员页面

-让用户使用使用电子邮件而不是密码的自定义用户模型注册/登录到我的web应用。它们还可以关联其他我的管理员不需要的数据

-将管理员帐户和用户帐户分离到不同的表中


我检查了如何通过扩展BaseUser来创建自定义用户类,但结果是我的管理员也成为了新的用户类型。那么,我可以为我的应用程序用户使用自定义用户模型,同时保持默认管理系统不变吗?或者我的设计有什么好的替代方案?

经过几个多小时的挖掘,我认为最好保留一个单一用户模型,并使用权限和角色进行管理


有多种方法可以使多个不同的用户模型验证工作,如此处所述:但我认为这不值得用于我的目的。

推荐的Django做法是创建一个指向用户的OneToOne字段,而不是扩展用户对象-通过这种方式,您可以在Django的用户之上构建,只装饰所需的新模型属性(例如):


你这样做有没有令人信服的理由?@e4c5我只是觉得这两件事是不同的,不应该混淆。但我想除了我的个人偏见之外,我没有什么令人信服的理由。我想我会选择标准设计。标准设计是有原因的。如果两个对象相似,则它们应该是相同的模型。您只需要有标志或“类型”列来区分它们。而用户模型已经具备了这一点。事实上,其中有两个。这只是一个例子-可能是is_guest,is_external-任何其他。不同的实现使用不同的含义-管理员角色对于不同的用例可能不同,guest,如果定义的话,可能具有与匿名不同的某些特权。Django权限允许自定义角色的灵活性。我可能需要创建一个具有自定义Django权限的半管理员半职员。
class Profile(models.Model):
    user = models.OneToOneField(User,parent_link=True,blank=True,null=True)
    profile_image_path =  models.CharField(max_length=250,blank=True, null=True)
    phone = models.CharField(max_length=250,blank=True, null=True)
    address = models.ForeignKey(Address,blank=True,null=True)
    is_admin = models.NullBooleanField(default=False,blank=True,null=True)

    class Meta:
       verbose_name = 'Profile'
       verbose_name_plural = 'Profiles'