Django查询与“|”合并返回重复

时间:2015-11-15 14:50:42

标签: django django-queryset

我有一个Channel型号。

在我的观点中,我有以下几行:

def default_channels(request) :     return Channel.objects.filter(is_default=True)
def subbed_channels(request):       return Channel.objects.filter(subscribers=request.user)
def moderated_channels(request):    return Channel.objects.filter(moderators=request.user)

然后

channels = default_channels(request) | subbed_channels(request) | moderated_channels(request)

通常情况下,如果我理解正确的话,这应该返回所有默认的频道,我订阅的频道,或者我适度的频道。但是,如果其中一些过滤器中存在某个通道,则不应多次返回该通道。

但是,由于某种原因,channels对象会多次返回一些对象。我甚至有一个返回4次的频道!

我该如何调试和解决这个问题?我用的是“|”吗?算错了?

3 个答案:

答案 0 :(得分:1)

queryset有一个.distinct()方法,您可以使用该方法删除重复的查询。

阅读文档here

然而,请看模型经理。所有这些观点都可以合并为一个。

答案 1 :(得分:0)

使用Q objects更好地完成您想要的工作。在你的情况下:

from django.db.models import Q

channels = Channel.objects.filter(Q(is_default=True) | Q(subscribers=request.user) | Q(moderators=request.user))

应该做的工作。

答案 2 :(得分:0)

channels = default_channels(request) | subbed_channels(request) | moderated_channels(request)

channels = channels.distinct()
相关问题