【问题标题】:nested query filter _ Django嵌套查询过滤器_Django
【发布时间】:2019-01-26 11:25:28
【问题描述】:
我保持简单。我有3个模型。
class C(models.model):
some_field = models.BooleanField(default=False)
class B(models.model):
b = models.ForeignKey(C)
class A(models.model):
a = models.ForeignKey(B)
我需要一个获取 A.a.b.some_field = True 的查询过滤器。我怎样才能做到这一点?
【问题讨论】:
标签:
django
django-queryset
【解决方案1】:
您可以通过以下方式过滤满足此条件的 A 对象:
A.objects.filter(<b>a__b__some_field=True</b>)
这将生成一个查询,或多或少类似于:
SELECT a.*
FROM a
JOIN b ON a.a_id = b.id
JOIN c ON b.b_id = c.id
WHERE c.some_field = 1
双下划线 (__) 可用于“透视”关系(如 ForeignKeys、OneToOneFields 和 ManyToManyFields)。如果它是...对多的字段,这是存在量化的。但是这里ForeignKeys 是多对一的关系,所以没关系。
注意:ForeignKeys 到B(或C)通常命名为b(或c),而不是a(或b),因为这是当前模型的名称。关系的名称通常指定它所针对的对象与当前模型的关系。