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

