You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:10:06