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
相关产品推荐
相关产品推荐

