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

Django用户注册接口问题:仅Username存入数据库,其他字段失败

问题原因

你的RegisterSerializer核心问题出在create方法:你只向User.objects.create()传入了username字段,first_name、email等其他字段虽然通过了序列化校验(存在于validated_data中),但并没有被用来创建User实例或赋值保存,所以这些字段的数据无法存入数据库。

另外还有两个细节问题:

  • is_admin不是Django默认User模型的字段,默认User模型用is_staff标识管理员权限,若未自定义User模型,这个字段不会生效。
  • 手动声明的email字段应该用serializers.EmailField而非CharField,这样能自动完成邮箱格式校验。
修正后的代码
from django.contrib.auth.models import User
from django.contrib.auth.password_validation import validate_password
from rest_framework import serializers


class RegisterSerializer(serializers.ModelSerializer):

    email = serializers.EmailField(required=True)  # 改为EmailField做格式校验
    first_name = serializers.CharField(max_length=50, required=True)
    last_name = serializers.CharField(max_length=50, required=True)
    password = serializers.CharField(
        write_only=True, required=True, validators=[validate_password])
    password2 = serializers.CharField(write_only=True, required=True)
    # 替换默认User模型不存在的is_admin为is_staff
    is_staff = serializers.BooleanField(default=False)

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email',
                  'password', 'password2', 'is_staff')

    def validate(self, attrs):
        if attrs['password'] != attrs['password2']:
            raise serializers.ValidationError(
                {"password": "Password fields didn't match."})
        # 移除模型不需要的password2字段
        attrs.pop('password2')
        return attrs

    def create(self, validated_data):
        # 解包所有校验后的字段,一次性创建User实例
        user = User.objects.create(**validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user
关键修改说明
  1. create方法优化:使用**validated_data解包所有校验通过的字段(已在validate中移除password2),一次性传入User.objects.create(),确保所有字段都被正确赋值。
  2. 邮箱字段修正:替换为EmailField,自动校验邮箱格式,避免无效数据存入。
  3. 管理员字段修正:改用默认User模型的is_staff字段;若自定义了包含is_admin的User模型,可保留原字段。
  4. 清理冗余字段:在validate方法中移除password2,避免传入模型创建方法引发错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:05:36