get_user_model()与导入auth模块User类的区别及模型使用疑问
嘿,这个问题问得特别到位——不少刚接触Django的开发者都会在这两种获取用户模型的方式里犯迷糊,我来给你拆解清楚核心区别:
两种获取User模型方式的核心区别
1. 自定义用户模型的兼容性差异
这是最关键的一点!
- 如果你项目后期要替换成自定义用户模型(比如继承
AbstractUser扩展字段,或者用AbstractBaseUser完全自定义),直接导入from django.contrib.auth.models import User就会踩坑——这个导入的是Django原生默认的用户模型,和你自定义的模型完全是两个东西,会导致外键关联错误、数据查询不匹配等问题。 - 而
get_user_model()是Django专门为这种场景设计的:它会自动读取你settings.py里AUTH_USER_MODEL配置的用户模型,不管你用默认的还是自定义的,都能精准拿到正确的模型类。这也是Django官方明确推荐的写法,尤其是开发可复用的第三方app时,必须用它,不然别人用你的app换了用户模型就直接崩了。
2. 导入时机的安全性
- 直接导入
User模型如果在模块加载阶段就使用(比如在models.py里定义外键的顶部导入),有可能遇到循环导入或者Django还未完成用户模型初始化的问题,导致启动报错。 get_user_model()是一个运行时函数,它会在代码实际执行的时候去获取用户模型,完美避开了模块加载时的初始化顺序问题,安全性更高。
3. 代码的可维护性
- 写死
from django.contrib.auth.models import User相当于把代码和Django默认用户模型绑定死了,万一哪天项目要换自定义用户模型,你得全局搜索替换所有用到这个导入的地方,维护成本极高。 - 用
get_user_model()的话,代码是动态适配的,后续不管怎么调整用户模型配置,这部分代码都不用改动,完全符合长期维护的代码规范。
什么时候用哪种?
简单总结:
- 如果你只是写个临时测试项目,确定永远不会用自定义用户模型,直接导入
User暂时能用,但不推荐;- 所有生产环境项目、可复用app、需要长期维护的代码,都应该优先用
get_user_model()。
内容的提问来源于stack exchange,提问作者WISAM
相关产品推荐
相关产品推荐

