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

Django多校考勤系统开发:获取用户信息时str对象无room属性错误

问题原因

你遇到的'str' object has no attribute 'room'错误,本质是**request.data['user']存储的是字符串格式的用户ID(而非User模型实例)**——前端提交的请求数据中,user字段一般传递用户ID值(数字或字符串形式),而非完整的用户对象,直接对字符串调用.room自然会触发属性不存在的错误。

解决方法

1. 先获取合法的User实例

在视图中,先从请求数据中提取用户ID,查询对应的User对象后再进行权限判断:

# 替换原视图中直接调用request.data['user'].room的代码
user_id = request.data.get('user')
try:
    target_user = User.objects.get(id=user_id)
except User.DoesNotExist:
    return Response({"message": "目标用户不存在"}, status=status.HTTP_404_NOT_FOUND)

# 后续用target_user.room访问目标用户的班级属性

2. 修复视图逻辑错误

原视图存在缩进错误、权限判断逻辑混乱等问题,以下是修正后的完整post方法:

def post(self, request, format=None):
    current_user = request.user
    try:
        perms = Perm.objects.get(user=current_user)
    except ObjectDoesNotExist:
        perms = None

    # 先获取目标用户实例
    user_id = request.data.get('user')
    try:
        target_user = User.objects.get(id=user_id)
    except User.DoesNotExist:
        return Response({"message": "目标用户不存在"}, status=status.HTTP_404_NOT_FOUND)

    serializer = AttendanceSerializer(data=request.data, context={'request': request})
    if serializer.is_valid():
        # 教师权限判断
        if current_user.role == "TEACHER":
            if current_user.homeroom != target_user.room:
                return Response({"message": "You don't have permission to perform this action 1"},
                                status=status.HTTP_400_BAD_REQUEST)
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        # 班干部权限判断
        elif perms is not None and current_user.role != 'STUDENT' and perms.is_monitor:
            if current_user.room != target_user.room:
                return Response({"message": "You don't have permission to perform this action 2"},
                                 status=status.HTTP_400_BAD_REQUEST)
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response({"message": "You don't have permission to perform this action 3"}, status=status.HTTP_400_BAD_REQUEST)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

3. 修复序列化器日期字段错误

原序列化器的create方法中,Date=datetime.today是将方法对象赋值给字段,需改为调用方法获取日期:

# 替换原create方法中的Date赋值代码
from datetime import date
# 仅存储日期(推荐)
Date=date.today()
# 或存储完整datetime
# Date=datetime.today()
额外优化建议
  • 可在序列化器中添加user字段的验证逻辑,提前校验用户是否存在,减少视图层重复代码
  • 将权限判断逻辑封装为自定义权限类,简化视图代码结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:10:44