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

时间:2018-09-24 09:43:12

标签: django django-orm

想象一下我有两个模型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(...)并用{{ 1}}。是否可以在不重新定义b_flag=True的RelatedManager的情况下做到这一点(仍然看起来像是个棘手的解决方案)?

UPD:外键反过来

1 个答案:

答案 0 :(得分:3)

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

例如:

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

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

因此,假设给定的B对象有三个相关的A,但是只有两个具有b_flag=True,则b_pos将包含这两个。

我真的建议不要本身以b_set为目标,因为如果您将A对象传递给方法,则该方法将假定b_set只是提供所有实际的B