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

Django Rest Framework新注册用户创建Auth Token报错求助

修复方案

1. 核心错误原因

报错本质是你代码中使用的User模型与DRF Token模型关联的User并非同一类实例——比如你自定义了用户模型,但DRF的Token仍默认关联Django自带的django.contrib.auth.models.User,导致类型不匹配。

同时你的代码存在两处冗余/错误点:

  • 调用serializer.save()后无需重新查询用户,该方法会直接返回创建好的用户实例
  • Django自带User模型的密码加密方法是set_password(),而非hash_password()(若使用自定义模型请忽略此条,确保用自身的加密方法即可)

2. 具体修复步骤

步骤1:确保User模型匹配

如果使用了自定义User模型,先在settings.py中配置:

AUTH_USER_MODEL = 'your_app.YourCustomUser'

这会让DRF的Token模型自动关联你的自定义User,彻底解决类型不匹配问题。

步骤2:优化注册函数代码

修改后的代码如下:

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from rest_framework.authtoken.models import Token
from .serializers import UserSerializer

@api_view(['POST'])
def register(request):
    serializer = UserSerializer(data=request.data)

    if serializer.is_valid():
        # 直接获取serializer.save()返回的用户实例,无需重复查询
        user = serializer.save()
        # 使用Django自带的密码加密方法(自定义模型替换为自身加密逻辑)
        user.set_password(request.data['password'])
        user.save()

        # 此时user是匹配Token要求的模型实例,可直接创建关联Token
        token = Token.objects.create(user=user)

        return Response({
            'token': token.key,
            'user': serializer.data
        }, status=status.HTTP_201_CREATED)
    
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

步骤3:优化UserSerializer(可选但推荐)

为了将密码逻辑封装在序列化器中,让视图代码更简洁,修改UserSerializer:

from django.contrib.auth.models import User
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)

    class Meta:
        model = User  # 自定义模型替换为你的CustomUser
        fields = ('username', 'password', 'email')  # 按需添加其他字段

    def create(self, validated_data):
        # 在序列化器内部完成用户创建与密码加密
        user = User.objects.create_user(
            username=validated_data['username'],
            password=validated_data['password'],
            email=validated_data.get('email')
        )
        return user

此时视图可进一步简化:

@api_view(['POST'])
def register(request):
    serializer = UserSerializer(data=request.data)

    if serializer.is_valid():
        user = serializer.save()
        token = Token.objects.create(user=user)

        return Response({
            'token': token.key,
            'user': serializer.data
        }, status=status.HTTP_201_CREATED)
    
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

3. 验证修复

重启服务后调用注册接口:

  • 成功创建用户并返回有效Token
  • 检查数据库,Token表的user_id会正确关联新用户ID,无类型错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:55:02