Django中获取通信用户ID时出现TypeError的修复方法
Django send_chat视图错误修复方案
错误原因分析
- values()返回格式不匹配:
messages.values('user_from__pk').distinct()返回的是包含字典的QuerySet(如[{'user_from__pk': 1}, {'user_from__pk': 2}]),但pk__in筛选器需要纯整数ID列表,导致类型错误。 - ForeignKey字段赋值逻辑错误:模型中
correspondents是ForeignKey类型,只能关联单个User实例,但代码中直接将QuerySet赋值给它,违反字段类型约束。
修复步骤及代码修改
1. 修复ID列表获取方式
将values()替换为values_list('user_from__pk', flat=True).distinct(),直接获取纯整数ID列表:
# 原代码 pk_list = messages.values('user_from__pk').distinct() # 修改后 pk_list = messages.values_list('user_from__pk', flat=True).distinct()
2. 修正correspondents字段赋值逻辑
根据业务需求选择以下两种方案之一:
方案A:correspondents仅关联当前对话对象
如果correspondents是记录当前消息的接收方/发送方,直接传入单个User实例:
# 视图中创建消息实例部分 insert = chatMessages( user_from=u_from, user_to=u_to, message=post['message'], correspondents=u_to # 或根据需求传入u_from )
方案B:correspondents关联所有通信用户
如果需要关联所有与当前用户通信过的用户,先将模型中correspondents改为ManyToManyField:
# models.py修改 class chatMessages(models.Model): user_from = models.ForeignKey(User, on_delete=models.CASCADE,related_name="sent") user_to = models.ForeignKey(User, on_delete=models.CASCADE,related_name="received") message = models.TextField() date_created = models.DateTimeField(default=timezone.now) # 改为多对多字段 correspondents = models.ManyToManyField(User, related_name="correspondents", blank=True) def __str__(self): return self.message
然后在视图中通过add()方法添加用户:
# 视图中保存消息部分 insert = chatMessages( user_from=u_from, user_to=u_to, message=post['message'] ) insert.save() # 批量添加通信用户 insert.correspondents.add(*pk_list)
完整修改后的视图代码
def send_chat(request): resp = {} User = get_user_model() if request.method == 'POST': post = request.POST try: u_from = User.objects.get(id=post['user_from']) u_to = User.objects.get(id=post['user_to']) messages = request.user.received.all() pk_list = messages.values_list('user_from__pk', flat=True).distinct() # 此处根据方案A/B选择对应代码 insert = chatMessages( user_from=u_from, user_to=u_to, message=post['message'], correspondents=u_to ) insert.save() resp['status'] = 'success' except User.DoesNotExist: resp['status'] = 'failed' resp['mesg'] = "用户不存在" except Exception as ex: resp['status'] = 'failed' resp['mesg'] = str(ex) else: resp['status'] = 'failed' return HttpResponse(json.dumps(resp), content_type="application/json")
内容的提问来源于stack exchange,提问作者Xrystik
相关产品推荐
相关产品推荐

