我正在与一个模型合作:
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])