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

无法覆盖Djoser的UserCreateSerializer,注册自定义字段为空怎么办?

问题诊断与解决方案

首先,你的代码逻辑本身没有错误,导致first_name、last_name字段为空的常见原因主要有以下几个,对应解决方法如下:

1. 未重启开发服务器

修改settings.py或序列化器代码后,Django不会自动热加载配置变更,必须重启服务器才能让自定义序列化器生效。这是最容易被忽略的点,请先重启你的开发服务。

2. 检查INSTALLED_APPS顺序

确保你的account应用在djoser之前加载,避免Djoser的默认配置覆盖自定义设置:

INSTALLED_APPS = [
    'account.apps.AccountConfig',  # 放在djoser前面
    ...
    'djoser',
]

3. 验证序列化器是否被调用

可以在自定义序列化器中添加调试代码,确认请求时是否触发了该序列化器:

from django.conf import settings
from djoser.serializers import UserCreateSerializer

class CustomUserCreateSerializer(UserCreateSerializer):
    class Meta(UserCreateSerializer.Meta):
        fields = (
            settings.LOGIN_FIELD,
            settings.USER_ID_FIELD,
            'password',
            'first_name',
            'last_name',
            'email',
        )

    def create(self, validated_data):
        # 添加调试打印,查看控制台输出
        print("自定义序列化器已触发!传入的验证数据:", validated_data)
        return super().create(validated_data)

重启服务器后发送POST请求,如果控制台打印了上述内容,说明序列化器已生效,此时检查请求参数是否正确传递了first_name和last_name;如果没有打印,说明配置路径有误。

4. 确认DJOSER配置路径正确性

检查DJOSER配置中user_create的路径是否完全匹配:

DJOSER = {
    'USER_CREATE_PASSWORD_RETYPE': True,
    'SERIALIZERS': {
        # 确保路径是account应用下的serializers.py中的CustomUserCreateSerializer类
        'user_create': 'account.serializers.CustomUserCreateSerializer',
    },
}

注意类名、文件名的拼写和大小写,Django对模块路径区分大小写。

5. 检查请求参数格式

确保POST请求的参数是正确的JSON格式,且first_name、last_name字段确实被包含在请求体中。例如用curl测试:

curl -X POST http://localhost:8000/api/v1/auth/users/ \
  -H "Content-Type: application/json" \
  -d '{
    "username": "test_user",
    "password": "test_pass123",
    "re_password": "test_pass123",
    "first_name": "张三",
    "last_name": "李四",
    "email": "test@example.com"
  }'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:51:18