Django创建RoomMember提示room需为Room实例的报错如何解决?
错误原因
核心问题是RoomMember模型的room字段是关联Room表的外键,Django ORM要求外键字段赋值时要么传入对应的Room模型实例,要么使用外键名_id的格式传入主键值,直接给room字段传入整数类型的主键pk不符合字段要求。
另外现有代码里RoomMember.objects.create().save()属于冗余写法:create方法已经完成了对象创建+数据库写入操作,不需要再额外调用save()。
修复代码
写法1:先查询Room实例再传入(推荐,可提前校验房间是否存在)
from django.shortcuts import get_object_or_404 def join_room(request, pk): # 校验对应房间是否存在,不存在直接返回404 room = get_object_or_404(Room, pk=pk) # 避免用户重复加入同一房间,生成冗余记录 if not RoomMember.objects.filter(room=room, user=request.user).exists(): RoomMember.objects.create(room=room, user=request.user) # 跳转房间详情需要传入对应房间的pk参数,否则会路由报错 return redirect('room_detail', pk=pk)
写法2:直接用外键_id字段传主键值(写法更简洁)
def join_room(request, pk): if not RoomMember.objects.filter(room_id=pk, user_id=request.user.id).exists(): RoomMember.objects.create(room_id=pk, user=request.user) return redirect('room_detail', pk=pk)
额外注意点
如果你的room_detail路由不需要接收pk参数,可以去掉redirect里的pk=pk参数,根据自己实际路由规则调整即可。
内容的提问来源于stack exchange,提问作者Ace7python
相关产品推荐
相关产品推荐

