Django ORM:在查询集中预过滤相关字段

Django ORM: pre-filtering related fields inside a queryset

假设我有两个模型,AB,它们被(松散地)定义为

class A(models.Model):
    a_flag = models.BooleanField()

class B(models.Model):
    b_flag = models.BooleanField()
    a = models.ForeignKey('A', ...)

我想要一个 A 的查询集,其中有 a_flag=True,对于这些,我希望进一步查询 a.b.filter(...) 是一种 'pre-filtered' b_flag=True。有没有一种方法可以在不重新定义 B 的 RelatedManager 的情况下执行此操作(仍然看起来像是一个 hacky 解决方案)?

UPD:外键是相反的

您可以使用 Prefetch-object [Django-doc](不要与 .prefetch_related(..) 调用混淆)并在此时进行一些过滤。

例如:

A.objects.filter(
    a_flag=True
).prefetch_related(
    <b>Prefetch('b_set', queryset=B.objects.filter(b_flag=True), to_attr='b_pos')</b>
)

现在 QuerySet 将包含 A 的集合,这些集合的属性 b_pos 包含相关的 B 对象,但 b_flag=True.

所以给定的 A 对象有三个相关的 B,但只有两个有 b_flag=True,那么 b_pos 将包含这两个。

我真的建议 不要b_set 本身为目标,因为如果您将 A 对象传递给方法,该方法将假定 b_set 简单地提供所有真实的 Bs.