【问题标题】:Django best user model designDjango 最佳用户模型设计
【发布时间】:2015-01-28 19:41:26
【问题描述】:

可能你们中的一些人会说这是一个反复出现的话题,但是在阅读了很多文章之后,我觉得它仍然很模糊。我的问题是关于使用和扩展 User 模型的最佳方式,以保留 Django 中可用的身份验证(和其他)机制。不过,我更喜欢描述我的设计:

  • 有些用户(患者)可以注册并提供基本信息(名字、姓氏、出生日期、性别、电子邮件、密码)。最好用电子邮件代替用户名。
  • 当患者在应用程序中时,它可以注册一个新患者(想象一个家庭成员),但不需要电子邮件和密码,因为他们不会登录系统。

对于第一部分,Django 文档建议将具有 OneToOne 关系的 User 扩展到 Profile。然而,为了用电子邮件替换用户名,他们建议创建一个从 AbstractUser 扩展的自定义用户,以及关联的 UserManager。第二个要求就像从用户到用户建立一对多的关系。那么,根据 Django,最好的策略应该是:创建一个全新的用户模型和一对多的用户-用户添加一个特定的属性来区分主要用户和家庭成员?或使用配置文件扩展 Django 用户,然后使用一对多关系配置文件配置文件?哪个选项可以最大程度地保留 Django 用户身份验证和模型管理的好处?

感谢您的任何评论、建议、示例。

【问题讨论】:

  • 只需按照电子邮件中的文档作为用户名。如果家庭成员不登录,则它是匿名用户,根本不是真实用户。只需为他们创建一个单独的模型。

标签: python django database-design design-principles


【解决方案1】:

首先,如果您想使用电子邮件作为用户名,请使用Django custom user 功能。它运作良好。 然后,请注意,并不是因为您创建了自己的用户,所以您无法使用配置文件对其进行扩展。

所以,一个好的解决方案可能是:

  • 创建一个 Django 自定义用户而不尝试向其添加特定字段(这里唯一的目的是使用电子邮件而不是用户名进行日志记录)。
  • 创建一个 PatientProfile 类,该类与 User 类具有一对一的关系(空白=True)。

这样,可以登录的患者将与一个用户实例相关联,并将为此目的使用该实例。另一方面,无法登录的患者不会与任何 User 实例相关。

最后,使用与 PatientProfile 的 OneToMany 关系来做你想做的事情是没有问题的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-01-25
  • 2021-07-29
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多