如何在Django中将新注册用户存入User模型(认证授权模块)?
我来帮你解决这个问题——核心原因是你现在的代码只把数据存到了自定义的Register模型里,完全没有和Django内置的auth.User模型产生交互,所以admin里的用户列表自然看不到新注册的用户。
第一步:修改序列化器,创建User实例并关联Register
你的RegisterSerializer现在只是保存Register对象,但没有创建对应的User。我们需要重写序列化器的create方法,先创建内置User,再关联到自定义的Register模型。
修改serializers.py:
from rest_framework import serializers from .models import Register from django.contrib.auth.models import User class RegisterSerializer(serializers.ModelSerializer): class Meta: model = Register fields = ['username', 'email', 'password'] def create(self, validated_data): # 1. 用Django内置的create_user方法创建User(自动哈希密码,避免明文存储) user = User.objects.create_user( username=validated_data['username'], email=validated_data['email'], password=validated_data['password'] ) # 2. 创建Register对象并关联刚刚创建的User register = Register.objects.create( user=user, username=validated_data['username'], email=validated_data['email'], password=validated_data['password'] # 注意:这里存明文密码不安全,后面会说优化方案 ) return register
第二步:优化你的Register模型(重要!)
你现在的Register模型里的username、email、password和内置User的字段完全重复,而且直接存明文密码有极大的安全风险。建议删掉这些重复字段,只保留和User的一对一关联,以及你真正需要的额外用户信息(比如手机号、地址等):
修改models.py:
from django.db import models from django.contrib.auth.models import User class Register(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) # 这里只添加User模型没有的字段,比如: # phone = models.CharField(max_length=11, blank=True) # address = models.TextField(blank=True) def __str__(self): return self.user.username # 之前的self.name会报错,因为模型里没有name字段,改用关联User的username
对应的,序列化器也要调整,因为Register模型不再有username等字段,我们需要显式定义这些字段来接收前端数据:
from rest_framework import serializers from .models import Register from django.contrib.auth.models import User class RegisterSerializer(serializers.ModelSerializer): # 显式定义需要接收的字段(因为模型里没有这些) username = serializers.CharField(max_length=100) email = serializers.EmailField(max_length=100) password = serializers.CharField(max_length=100, write_only=True) # write_only避免返回密码 class Meta: model = Register fields = ['username', 'email', 'password'] def create(self, validated_data): # 提取User所需数据,创建User实例 user = User.objects.create_user( username=validated_data['username'], email=validated_data['email'], password=validated_data['password'] ) # 创建Register并关联User register = Register.objects.create(user=user) return register
更简单的替代方案:直接序列化内置User模型
如果你不需要存储额外的用户信息,完全可以不用自定义Register模型,直接基于auth.User写序列化器,这样代码更简洁:
serializers.py
from rest_framework import serializers from django.contrib.auth.models import User class UserRegisterSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['username', 'email', 'password'] extra_kwargs = {'password': {'write_only': True}} # 密码只写不读 def create(self, validated_data): # 用create_user自动处理密码哈希 return User.objects.create_user(**validated_data)
views.py
from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from .serializers import UserRegisterSerializer class RegisterView(APIView): def post(self, request, format=None): serializer = UserRegisterSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response("Thank you for registering", status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
验证效果
完成以上修改后,用Postman重新发送注册请求,你会发现新用户已经出现在admin的「Users(Authentication and Authorization)」列表里了——因为我们现在真正创建了auth.User实例。
内容的提问来源于stack exchange,提问作者jelly_bean
相关产品推荐
相关产品推荐

