DRF集成Djoser时自定义用户序列化器未生效的原因排查
按照触发概率从高到低排序:
缺少对应端点的序列化器映射键
/auth/users/me/是Djoser里独立的当前用户信息端点,它加载序列化器时读取的是current_user配置键,而非user键。你当前的配置仅给user键做了自定义序列化器映射,没有配置current_user的映射,因此请求me接口时,Djoser会一直使用内置的默认UserSerializer,也就是仅返回id、username、email三个字段的逻辑。
修正时需要在SERIALIZERS配置块里补上对应的键值:DJOSER = { 'SERIALIZERS': { 'user_create': 'backend.accounts.serializers.UserCreateSerializer', 'user': 'backend.accounts.serializers.UserCreateSerializer', 'current_user': 'backend.accounts.serializers.UserCreateSerializer', # 补充me接口的映射 'user_delete': 'djoser.serializers.UserDeleteSerializer', } }配置层级错误
Djoser不会读取settings根目录下直接定义的SERIALIZERS字典,所有自定义配置必须包裹在DJOSER这个顶层配置块下。如果你的SERIALIZERS是直接写在settings全局位置、没有套在DJOSER = {}内部,所有自定义逻辑都会被Djoser直接忽略,完全走内置默认逻辑。序列化器加载失败触发静默回退
Djoser在加载配置中的序列化器路径时,如果遇到导入失败(比如路径写错、类名写错、自定义序列化器存在语法或逻辑错误无法初始化),不会抛出直白的报错,会直接静默回退到内置默认序列化器。
你可以进入Django Shell手动测试路径是否可正常加载:from django.conf import settings from django.utils.module_loading import import_string # 替换成你要测试的序列化器路径 import_string(settings.DJOSER['SERIALIZERS']['current_user'])如果执行后没有返回异常,说明路径加载正常;如果抛出导入错误,就需要对应修正代码的路径和类实现。
自定义序列化器的继承写法有疏漏
自定义序列化器直接和导入的父类同名时,很容易在类体内部引用到错误的对象。更稳妥的写法是对导入的基类做别名区分,避免命名冲突:# 对基类做别名,避免和自定义类名冲突 from djoser.serializers import UserCreateSerializer as BaseUserCreateSerializer from djoser.serializers import UserDeleteSerializer class UserCreateSerializer(BaseUserCreateSerializer): delete_request = DeleteUserSerializer(read_only=True) class Meta(BaseUserCreateSerializer.Meta): model = User fields = ( 'id', 'email', 'username', 'password', 'delete_request', )另外要注意,你在fields里加的
password是写入字段,默认不会在me接口的响应中返回,就算配置完全生效,响应里也不会出现password字段,只会展示read_only的关联字段(比如delete_request)。基础运行环境问题
改完配置后如果没有重启Django服务、没激活正确的虚拟环境、本地存在旧的settings缓存,也会导致配置改动不生效,这类问题重启服务后基本就能解决。
内容的提问来源于stack exchange,提问作者Dziugito Bizox

