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
相关产品推荐
相关产品推荐

