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

Django数据库查询如何获取消息表sender与receiver组合的去重结果?

问题解决方法

你之前的distinct()没有生效,是因为Django默认会对查询返回的整行所有字段做去重,消息表中除了sender、receiver外还有主键、发送时间、消息内容等唯一字段,只要有一个字段不同就会被判定为不同记录,所以无法实现收发组合去重的需求。

你可以根据自己的需求选择以下方案:

  • 仅需要获取不重复的收发双方组合
    可以配合values()指定需要保留的字段,再调用distinct()即可对指定字段组合去重:
    Messages.objects.filter(Q(sender=15) | Q(receiver=15)).values("sender", "receiver").distinct()
    
  • 使用PostgreSQL数据库,需要保留完整的消息记录
    PostgreSQL支持distinct()传入指定字段,会保留每组匹配字段的第一条完整记录:
    # 仅PostgreSQL数据库支持该语法
    Messages.objects.filter(Q(sender=15) | Q(receiver=15)).distinct("sender", "receiver")
    
  • 仅需要获取和15有过消息往来的所有用户ID
    可以通过注解直接提取对端用户ID再去重,一步得到结果:
    from django.db.models import Case, When, IntegerField
    
    chat_users = Messages.objects.filter(Q(sender=15) | Q(receiver=15)).annotate(
        chat_user=Case(
            When(sender=15, then="receiver"),
            When(receiver=15, then="sender"),
            output_field=IntegerField()
        )
    ).values_list("chat_user", flat=True).distinct()
    

内容的提问来源于stack exchange,提问作者Ruma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:06:03