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

如何从Django数据库中查询获取去重的消息关联用户ID?

Django ORM 获取和指定ID关联的对端去重ID列表

你可以通过以下两种方式实现需求,都是数据库层面操作性能更优:


方案1:使用union联合查询(写法最简单)

分别查询两类数据再合并,union默认会自动去重:

def get_queryset(self):
    # 获取sender=15对应的所有receiver_id
    q1 = Messages.objects.filter(sender=15).values_list("receiver", flat=True)
    # 获取receiver=15对应的所有sender_id
    q2 = Messages.objects.filter(receiver=15).values_list("sender", flat=True)
    # 合并去重返回结果
    return q1.union(q2)

返回的就是去重后的ID序列,和你预期的[11, 17]格式一致。


方案2:使用annotate统一对端字段(适合需要保留原查询其他字段的场景)

如果后续还要用到消息记录的其他字段,可以通过条件注解统一对端ID字段后再去重:

from django.db.models import Q, Case, When, IntegerField

def get_queryset(self):
    return Messages.objects.filter(
        Q(sender=15) | Q(receiver=15)
    ).annotate(
        # 统一提取和15对话的对端ID
        target_id=Case(
            When(sender=15, then="receiver"),
            When(receiver=15, then="sender"),
            output_field=IntegerField()
        )
    ).values_list("target_id", flat=True).distinct()

说明:

  • values_list(flat=True):将查询结果从元组格式转为单个值的序列
  • union():默认自动去重,无需额外加distinct
  • distinct():用于对注解后的target_id字段去重

内容的提问来源于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 03:15:07