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
相关产品推荐
相关产品推荐

