Django存储用户个人信息选User模型还是User+UserProfile符合最佳实践?
Django用户模型扩展方案选择参考
没有绝对通用的最佳实践,两种方案的适用场景完全取决于你的业务需求,目前Django官方更推荐优先使用扩展AbstractUser的单模型方案,仅在有明确拆分需求时再用双模型方案。
方案1(单User模型)适用场景
如果你要收集的这些个人信息属于和用户账号强绑定的通用属性,没有特殊的权限或拆分要求,优先选这个方案:
- 优点:
- 代码更简洁,调用属性直接用
request.user.birth_date即可,不需要额外关联查询 - 没有额外的维护成本,不用处理UserProfile实例漏创建的问题,也不用做跨模型的事务、表单校验逻辑
- 查询效率更高,不存在联表开销或者N+1查询问题
- 代码更简洁,调用属性直接用
- 缺点:如果后续个人字段持续迭代,会导致User表越来越臃肿,也不方便对不同字段做细粒度的权限隔离。
方案2(User+UserProfile双模型)适用场景
只有当你有明确的拆分诉求时再选这个方案,常见的拆分诉求包括:
- User表仅保留登录相关的核心字段,后续几乎不会改动,而个人信息字段会频繁增改,需要隔离变动风险
- 需要对个人敏感信息做单独的权限控制,比如普通接口只能拿到User表的公开信息,只有特定权限才能访问Profile里的隐私字段
- 不同用户角色的个人属性差异极大,后续可以扩展为不同类型的Profile表关联到同一个User,避免单模型出现大量空字段
- 缺点:
- 需要额外处理UserProfile的自动创建逻辑,一般要配合注册逻辑手动创建或者用信号监听User实例创建,否则调用时容易报错
- 查询个人信息需要做联表或者预加载,否则会出现N+1性能问题
- 序列化、表单处理需要同时适配两个模型,代码量会更高
总结
如果没有上面提到的明确的拆分需求,直接用方案1就足够了,双模型是Django早期自定义用户体系还不完善时的常用方案,现在已经不是首选。
内容的提问来源于stack exchange,提问作者aladagemre
相关产品推荐
相关产品推荐

