Django中筛选含指定用户的ChatRoom报错,求get方法正确实现
解决ChatRoom多对多查询及创建的错误问题
问题根源梳理
- 异常捕获逻辑错误:原代码中用
except room.DoesNotExist,但当get()方法失败时room变量还未赋值,直接引用会触发变量未定义错误。 - 多对多字段创建方式错误:
ChatRoom的users是多对多字段,无法通过create(users1=user, users2=request.user)直接赋值,必须先创建实例再关联用户。 - POST数据获取不规范:通过
list(user)[1]取POST数据的方式完全不可靠,依赖参数顺序,容易出错。 - 模型方法错误:
__str__方法返回整数类型的pk会触发类型错误,需转为字符串。 - 类名大小写错误:
USER.objects.get应为User.objects.get(Django内置用户模型类名为User)。
修正后的完整代码
models.py
from django.contrib.auth.models import User from django.db import models class ChatRoom(models.Model): users = models.ManyToManyField(User, related_name='chat_rooms') # 修改related_name避免字段名冲突 def __str__(self): return str(self.pk) # 转为字符串返回,避免类型错误
views.py
from django.shortcuts import render, redirect from django.contrib.auth.models import User from django.db.models import Q from .models import ChatRoom def homechat(request): if request.method == 'POST': # 明确获取前端表单提交的用户名(假设字段名为username) target_username = request.POST.get('username') if not target_username: return render(request, 'chatapp/index.html', {'error': '请输入目标用户名'}) # 捕获目标用户不存在的情况 try: target_user = User.objects.get(username=target_username) except User.DoesNotExist: return render(request, 'chatapp/index.html', {'error': '该用户不存在'}) # 查询同时包含当前用户和目标用户的聊天室 try: room = ChatRoom.objects.get(Q(users=request.user) & Q(users=target_user)) return redirect('room', room=room.pk) except ChatRoom.DoesNotExist: # 创建新聊天室并关联两个用户 room = ChatRoom.objects.create() room.users.add(request.user, target_user) return redirect('room', room=room.pk) return render(request, 'chatapp/index.html')
核心修正说明
- 异常捕获改为
ChatRoom.DoesNotExist,直接引用模型类的异常,避免变量未定义问题。 - 多对多字段关联:先创建
ChatRoom实例,再通过add()方法批量添加关联用户。 - 规范POST数据获取:用
get()方法指定字段名,增加参数校验和异常处理,提升代码稳定性。 - 修改
related_name为chat_rooms,避免与User模型本身的字段命名冲突。
内容的提问来源于stack exchange,提问作者narcel
相关产品推荐
相关产品推荐

