Django - 如何以不需要 DISTINCT 的方式编写此查询



我正在与一个模型合作:

class Foo(models.Model):
    name = models.CharField(max_length=255)
    bars = models.ManyToManyField('Bar')

在视图中,我可以访问Bar对象列表,并且需要获得在bars列表中具有任何Bar对象的所有Foo对象,因此我这样做:

foos = Foo.objects.filter(bars__in=list_of_bars)

问题是有重复,如果一个Foo有2个酒吧,这两个酒吧都在我的list_of_bars,一个简单的distinct解决:

foos = Foo.objects.distinct().filter(bars__in=list_of_bars)

这一切都很好,除了将DISTINCT添加到查询中使其非常慢,因为数据库中有200万个Foo对象。

说了这么多,你能想到什么方法不使用DISTINCT,但达到相同的结果集?

在python中总是可以选择唯一的:

foos = set(Foo.objects.filter(bars__in=list_of_bars))

你需要查询集。所以,也许(只是也许)这个快速肮脏的黑客可以帮助你。它是丑陋的,但也许它是快速的(不确定)。

def get_query_set(self):
    foos = set(Foo.objects.filter(bars__in=list_of_bars))
    return Foo.objects.filter(id__in=[f.id for f in foos])

相关内容

  • 没有找到相关文章

最新更新