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

get_user_model()与直接导入CustomUser模型的差异及优劣对比

Django中直接导入自定义用户模型 vs 使用get_user_model()的区别与优劣

你提供的两段代码核心区别在于用户模型的引用方式,具体差异和优劣分析如下:

一、两段代码的核心区别

1. 引用方式不同

  • 第一段代码直接从自定义应用模型中导入CustomUser类:
from rest_framework import generics
from users.models import CustomUser
from .serializers import CustomUserSerializer

class APIView(generics.ListAPIView):
    queryset = CustomUser.objects.all()
    serializer_class = CustomUserSerializer
  • 第二段代码通过Django提供的get_user_model()函数动态获取用户模型:
from rest_framework import generics
from django.contrib.auth import get_user_model
from .serializers import CustomUserSerializer

class APIView(generics.ListAPIView):
    queryset = get_user_model().objects.all()
    serializer_class = CustomUserSerializer

2. 代码耦合度不同

  • 直接导入CustomUser属于静态引用,代码和具体的用户模型类强绑定,一旦模型的位置、类名发生变化,所有引用它的代码都需要同步修改。
  • get_user_model()是动态引用,它会读取Django配置中AUTH_USER_MODEL的值,返回对应的用户模型(无论是默认的User还是你自定义的CustomUser),代码和具体模型实现解耦。

二、get_user_model()是否更优?

是的,get_user_model()更符合Django的最佳实践,优势主要体现在:

  • 扩展性更强:如果后续项目需要更换用户模型(比如调整自定义模型结构、切换到其他第三方用户模型),使用get_user_model()的代码无需修改,直接导入的代码则要逐一替换所有引用点。
  • 兼容性更好:在开发可复用的Django应用时,get_user_model()能让你的应用适配不同项目的用户模型配置,不会因为依赖特定模型而无法复用。
  • 避免初始化异常:Django启动时配置加载有顺序,直接导入用户模型可能因配置未加载完成导致导入错误,而get_user_model()是运行时动态获取,能规避这类问题。

当然,如果你的项目确定不会变更用户模型,两种写法都能正常运行,但从长期维护和代码健壮性来看,get_user_model()是更优的选择。

内容的提问来源于stack exchange,提问作者user3848207

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:55:19