如何获取查询集中所有对象的所有外键的django查询集

如何获取查询集中所有对象的所有外键的django查询集,django,django-queryset,Django,Django Queryset,我有一个模型(或者实际上有两个模型,但另一个没有那么重要) 当我有一个Foo:s的查询集时,如何获取该查询集引用的所有条实例 因为我使用的是MySQL,所以我不能使用.distinct(['bar')您可以使用foo\u queryset.bar\u set.all()来获取bar的所有实例 foo_queryset = Foo.objects.filter(attr=value) referenced_bars = foo_queryset.bar_set.all() 包含相关的Foos的Q

我有一个模型(或者实际上有两个模型,但另一个没有那么重要)

当我有一个
Foo
:s的查询集时,如何获取该查询集引用的所有
实例


因为我使用的是MySQL,所以我不能使用
.distinct(['bar')

您可以使用
foo\u queryset.bar\u set.all()
来获取
bar
的所有实例

foo_queryset = Foo.objects.filter(attr=value)
referenced_bars = foo_queryset.bar_set.all()

包含相关的
Foo
s的
QuerySet
在这一点上位于何处?我想——这个想法可能是错误的——忽略查询集是最容易的(不需要关心一个对象)。相反,将此初始qeryset的限制/过滤器直接应用于条形图。基本上,foo\u set\uu attr=value只是一个占位符,您可以扩展到任何您想要定义您想要使用的foo的地方。这会有帮助吗?还是你坚持使用一个单独的Foo查询集?这里有一个指向文档中字段查找的链接。我很好奇,这有多高效,有没有更高效的方法?@Algorithmatic-这是一个非常广泛的问题,它取决于你使用的数据库、数据和数据索引。在MySQL上运行这个会非常慢,因为MySQL在处理Django生成的子查询方面非常糟糕。为了解决这个问题,您可以执行1次查询来获取
bar\u id
,然后将其传递给
bar.objects.filter子句
bar.objects.filter(id\u in=set(foo\u queryset.values('bar\u id'))
显然,如果您有很多
foo
对象,那么这也可能很慢,在我看来,这可能不是一个有效的解决方案。如果您有数千个
条形码id
foo_queryset = Foo.objects.filter(attr=value)
referenced_bars = Bar.objects.filter(id__in=foo_queryset.values('bar_id'))
bars = Bar.objects.filter(foo_set__attr=value)
foo_queryset = Foo.objects.filter(attr=value)
referenced_bars = foo_queryset.bar_set.all()