Django自定义User模型最佳实践:新项目选自定义还是默认用户模型
Django 新项目用户模型选型参考
首先明确:Django 官方确实明确推荐所有新项目启动时优先创建自定义 User 模型,哪怕你暂时没有扩展用户字段的需求。
两种方案的优劣势对比
方案1:使用默认User模型 + 一对一关联Profile/UserInfo表
- 优势
- 前期上手快,不需要修改默认认证逻辑,对Django新手友好,无需提前理解用户模型替换的相关规则
- 是已上线运行很久的老项目扩展用户属性的唯一可行方案,避免修改核心User表带来的高风险迁移操作
- 弊端
- 所有用户属性查询都需要多一次关联表查询,代码需要多写一层
.profile调用,高并发场景下会有额外的性能损耗 - 涉及用户属性的过滤、排序操作需要跨表查询,ORM 语句编写更繁琐,也更难优化
- 完全无法修改默认User的内置字段规则,比如要把
username改为非唯一、用手机号/邮箱替代username作为登录凭证这类需求都无法实现 - 业务迭代后期用户属性越来越多的时候,表结构拆分太碎会显著提升维护和排查问题的成本
- 所有用户属性查询都需要多一次关联表查询,代码需要多写一层
方案2:自定义User模型
- 优势
- 灵活度最高,可以自由调整内置字段的属性、替换默认登录字段、直接在User表新增所有需要的用户属性,无需关联额外表
- 代码编写更简洁,所有用户属性直接从
request.user即可获取,不需要额外查关联表 - 规避后期业务扩展后需要改造用户模型的高风险迁移操作,前期只需要花几分钟配置,一劳永逸
- 对Django生态的第三方认证、权限类包兼容性更好,大部分第三方包都默认做了自定义User模型的适配,拆分Profile的场景反而需要额外做兼容处理
- 弊端
- 纯新手第一次配置容易踩坑,比如还没配置
AUTH_USER_MODEL就先执行了migrate,后续修改会报错,需要删除迁移文件甚至库表重试,有一点学习成本 - 对于完全不需要扩展用户属性的极小工具类项目、一次性Demo来说,属于冗余操作,但其实配置成本极低,对开发效率影响可以忽略
- 纯新手第一次配置容易踩坑,比如还没配置
实际选型建议
只要是需要长期迭代的正式业务项目,不管你当下有没有扩展用户字段的需求,都优先选择自定义User模型,最简配置代码如下:
# 你新建的accounts应用下的models.py from django.contrib.auth.models import AbstractUser from django.db import models class User(AbstractUser): # 暂时不需要额外字段就空着,后续要加直接写就行 pass
只需要再在项目settings.py中加一行配置AUTH_USER_MODEL = "accounts.User"即可,后续所有操作和默认User模型完全一致,几乎没有额外成本。
如果是临时写的一次性Demo、测试项目,或者是已经上线的老项目,选择默认User加关联Profile的方案没有问题。
内容的提问来源于stack exchange,提问作者Zahin Zaman
相关产品推荐
相关产品推荐

