Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-如何以不需要区分的方式编写此查询_Django_Django Models_Query Optimization_Django Queryset - Fatal编程技术网

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])