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

Django中获取通信用户ID时出现TypeError的修复方法

Django send_chat视图错误修复方案

错误原因分析

  1. values()返回格式不匹配:messages.values('user_from__pk').distinct()返回的是包含字典的QuerySet(如[{'user_from__pk': 1}, {'user_from__pk': 2}]),但pk__in筛选器需要纯整数ID列表,导致类型错误。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:03:31