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

Django REST Framework无法识别外键User实例问题求助

Django REST Framework 创建 UserProfile 时出现 AnonymousUser 错误

我尝试在Django模型中保存用户资料信息,相关代码如下:

模型定义

class UserProfile(models.Model): 
  user = models.ForeignKey(User, on_delete=models.CASCADE)
  reg_date = models.DateTimeField(auto_now_add=True, blank=True)
  name = models.CharField(max_length=30, blank=True)
  family = models.CharField(max_length=30,  blank=True)
  phoneNumber = models.CharField(max_length=20,  blank=True)

  def __str__(self) :
    return self.name + self.family

序列化器定义

class UserProfileSerializer(serializers.ModelSerializer): 
  class Meta: 
    model= UserProfile
    fields = ['user', 'reg_date', 'name', 'family', 'phoneNumber']

视图定义

class UserProfileView(viewsets.ViewSet): 
  def create(self, request): 
    UserProfile.objects.create(user = request.user)

Axios 请求代码

const a = await ProfileAPI.post('',
        {
          headers: {
            'Authorization': mytoken
          }
        })

使用dj-rest-auth提供的已登录用户令牌发送请求,令牌验证正常且请求已触发UserProfileView,但返回错误:

ValueError: Cannot assign "<django.contrib.auth.models.AnonymousUser object at 0x000001F069C59190>": "UserProfile.user" must be a "User" instance.


问题原因及修复方案

核心问题

request.user为AnonymousUser,说明视图未配置身份验证类,DRF无法解析Authorization令牌并将请求用户关联为已登录的User实例;同时Axios的请求格式错误,headers被错误放入请求体中。

具体修复步骤

1. 为视图添加身份验证和权限控制

确保DRF能解析令牌并限制仅登录用户访问:

from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework import status
from rest_framework.response import Response

class UserProfileView(viewsets.ViewSet): 
    authentication_classes = [TokenAuthentication]  # 启用Token认证
    permission_classes = [IsAuthenticated]  # 仅允许登录用户调用

    def create(self, request): 
        # 此时request.user为已登录的User实例
        profile = UserProfile.objects.create(user=request.user)
        # 返回标准化的REST响应
        serializer = UserProfileSerializer(profile)
        return Response(serializer.data, status=status.HTTP_201_CREATED)

2. 修正Axios请求格式

Axios的post参数格式为url, data, config,headers属于config而非请求体,同时注意Token前缀:

const a = await ProfileAPI.post('', 
        {},  // 无额外字段时传空对象作为请求体
        {
          headers: {
            'Authorization': `Token ${mytoken}`  // dj-rest-auth需要Token前缀,若令牌已包含则省略
          }
        })

3. 可选优化:用序列化器简化创建逻辑

遵循DRF最佳实践,利用序列化器处理数据验证与保存:

class UserProfileView(viewsets.ViewSet): 
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated]

    def create(self, request): 
        serializer = UserProfileSerializer(data={'user': request.user.id})
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:03:24