使用Djoser创建用户时first_name等附加字段未被存储该如何解决
问题原因
Djoser默认的用户创建序列化器仅开放了username、email、password三个可写入字段,你请求中携带的其他额外字段会被序列化器直接过滤,不会写入数据库,和你当前已有的DJOSER配置项无关。
解决方法
1. 自定义用户创建序列化器
在你项目对应App的serializers.py文件中新增自定义序列化器,继承Djoser原生的UserCreateSerializer,扩展需要支持的字段:
from djoser.serializers import UserCreateSerializer from django.contrib.auth.models import User class CustomUserCreateSerializer(UserCreateSerializer): class Meta(UserCreateSerializer.Meta): model = User # 按你的业务需求添加需要支持写入的字段 fields = ('id', 'username', 'email', 'password', 'first_name', 'last_name', 'is_staff')
2. 更新DJOSER配置
在settings.py的DJOSER配置字典中新增序列化器指向配置,指定用户创建流程使用你自定义的序列化器,原有其他配置保持不变即可:
DJOSER = { # 你原来的所有配置项保持不变 'PASSWORD_RESET_CONFIRM_URL': '#/password/reset/confirm/{uid}/{token}', 'USERNAME_RESET_CONFIRM_URL': '#/username/reset/confirm/{uid}/{token}', 'ACTIVATION_URL': '#/activate/{uid}/{token}', 'SEND_ACTIVATION_EMAIL': True, 'SEND_CONFIRMATION_EMAIL': True, 'PASSWORD_CHANGED_EMAIL_CONFIRMATION': True, 'USERNAME_CHANGED_EMAIL_CONFIRMATION': True, 'USER_CREATE_PASSWORD_RETYPE': True, 'SET_PASSWORD_RETYPE': True, 'PASSWORD_RESET_CONFIRM_RETYPE': True, 'LOGOUT_ON_PASSWORD_CHANGE' : True, 'PASSWORD_RESET_SHOW_EMAIL_NOT_FOUND': False, 'USERNAME_RESET_SHOW_EMAIL_NOT_FOUND': False, 'token': 'djoser.serializers.TokenSerializer', 'token_create': 'djoser.serializers.TokenCreateSerializer', # 新增以下序列化器配置 'SERIALIZERS': { # 替换为你实际的App名对应的序列化器路径 'user_create': '你的App名称.serializers.CustomUserCreateSerializer', } }
注意事项
is_staff是Django用户模型的管理员标识字段,如果你对公共注册接口开放该字段的写入权限,会存在普通用户自行注册为管理员的安全风险。如果仅需管理员可创建带is_staff标识的账号,建议不要在公共注册接口的序列化器中加入该字段,可单独给后台管理接口配置专属序列化器。- 如果需要后续用户信息查询接口也返回
first_name、last_name等自定义字段,可同时自定义继承自djoser.serializers.UserSerializer的序列化器,在SERIALIZERS配置中新增'user': '你的App名称.serializers.自定义User序列化器名'即可。
内容的提问来源于stack exchange,提问作者Dark Sorrow
相关产品推荐
相关产品推荐

