Django-如何以不需要区分的方式编写此查询
我和一个模特一起工作:Django-如何以不需要区分的方式编写此查询,django,django-models,query-optimization,django-queryset,Django,Django Models,Query Optimization,Django Queryset,我和一个模特一起工作: class Foo(models.Model): name = models.CharField(max_length=255) bars = models.ManyToManyField('Bar') 在视图中,我可以访问BarObject列表,并且需要获取在其Bar列表中包含任何Bar对象的所有Foo对象,因此我执行以下操作: foos = Foo.objects.filter(bars__in=list_of_bars) 问题是,如果一个Foo有
class Foo(models.Model):
name = models.CharField(max_length=255)
bars = models.ManyToManyField('Bar')
在视图中,我可以访问BarObject列表,并且需要获取在其Bar列表中包含任何Bar对象的所有Foo对象,因此我执行以下操作:
foos = Foo.objects.filter(bars__in=list_of_bars)
问题是,如果一个Foo有两个条,并且这两个条都在我的条列表中,那么会有重复的条,简单的distinct解决了这个问题:
这一切都很好,除了向查询中添加DISTINCT会使查询速度非常慢,因为数据库中有200万个Foo对象
综上所述,您能想到哪些方法不使用DISTINCT,而是实现相同的结果集?如果涉及到修改模型,那没关系。您可以在python中选择Unique:
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])
谢谢这是针对管理员的,它需要来自get\u query\u set的queryset。顺便说一句,我想你是想在实际查询部分中去掉.distinct,没有?修复distinct并添加了一些建议。我将此标记为答案,因为我不认为有更好的方法,但在我的情况下,该查询大约需要1 MB的SQL:
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])