【问题标题】:How to get a django QuerySet of all ForeignKeys of all objects in a Queryset如何获取Queryset中所有对象的所有ForeignKeys的django QuerySet
【发布时间】:2012-09-26 11:32:34
【问题描述】:

我有一个模型(或者实际上是 2 个模型,但另一个不相关)

class Foo(models.Model):
    ...
    bar = models.ForeignKey(Bar,
        ...
    )

当我有一个 Foo:s 的 QuerySet 时,如何获取该 QuerySet 引用的所有 Bar 实例?

由于我用的是MySQL,所以我不能.distinct(['bar'])

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:
    foo_queryset = Foo.objects.filter(attr=value)
    referenced_bars = Bar.objects.filter(id__in=foo_queryset.values('bar_id'))
    

    【讨论】:

    • 这里是文档中in字段查找的链接。
    • 我很好奇,这效率如何?有没有更有效的方法?
    • @Algorithmatic - 这是一个非常广泛的问题,它取决于您使用的数据库、数据和该数据的索引。在 MySQL 上运行它可能会非常慢,因为 MySQL 在处理 Django 生成的子查询方面很糟糕。要解决此问题,您可以执行 1 次查询以获取 bar_ids,然后将其传递给 __in 子句 Bar.objects.filter(id__in=set(foo_queryset.values('bar_id'))),显然如果您有很多 Foo 对象,这也可能很慢
    • 在我看来,这可能不是一个有效的解决方案。如果您有数千个 bar_id 怎么办?
    【解决方案2】:
    bars = Bar.objects.filter(foo_set__attr=value)
    

    【讨论】:

    • 我的QuerySet 包含相关的Foos 在哪里?
    • 我想——这个想法可能是错误的——忽略 querset 是最容易的(一个不需要关心的对象)。而是将此初始 qeryset 的限制/过滤器直接应用于 Bars。基本上, foo_set__attr=value 只是一个占位符,您可以将其扩展到任何您想要定义您想要使用的 Foo 的内容。这会有所帮助还是您坚持使用单独的 Foo 查询集?
    【解决方案3】:

    您可以使用foo_queryset.bar_set.all() 来获取您的Bar 的所有实例

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

    Django documentation 有更多详细信息。

    【讨论】:

      猜你喜欢
      • 2011-06-16
      • 1970-01-01
      • 2020-10-31
      • 2023-03-24
      • 1970-01-01
      • 2018-11-12
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多