Django ORM:在查询集中预过滤相关字段
Django ORM: pre-filtering related fields inside a queryset
假设我有两个模型,A
和 B
,它们被(松散地)定义为
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
简单地提供所有真实的 B
s.
假设我有两个模型,A
和 B
,它们被(松散地)定义为
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
简单地提供所有真实的 B
s.