如何从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():默认自动去重,无需额外加distinctdistinct():用于对注解后的target_id字段去重
内容的提问来源于stack exchange,提问作者Ruma
相关产品推荐
相关产品推荐

