在Django中过滤多对多关系

时间:2010-01-13 09:33:17

标签: django django-models

我有这种模型对象的结构:

A类:
b = models.ManyToManyField("B")
B级:
c = models.ForeignKey("C")
d = models.ForeignKey("D")
C级:
d = models.ForeignKey("D")

这是我想要的查询:
我想得到对象A的所有B对象,然后在每个B对象中执行D对象和c.d对象之间的比较。

我知道只需使用for循环移动B集合并进行此比较。 但我潜入了ManyToMany的关系,然后我发现我可以做到以下几点:

bObjects = A.objects.all().b

q = bObjects.filter(c__d=None)

这是有效的,它为我提供了None d字段的所有c对象。但是,当我尝试以下内容时:

q = bObjects.filter(c__d=d)

它没有定义,但d是对象B中的c之类的对象。

可能是什么问题?如果你建议进一步的方法来完成这项任务我会很高兴。 我通常在尝试使用多个子对象并且不使用循环的单个操作中编写查询。

1 个答案:

答案 0 :(得分:6)

  

q = bObjects.filter(c_d=d) //我没有定义。但是d是对象B中的c之类的对象。

试试这个:

from django.db.models import F
q = bObjects.filter(c__d=F('d'))

至于下面评论中的问题,你可以通过以下方式获得1个sql查询而不是100个:

1)如果您可以根据查询表达您对A对象的选择(例如a.price< 10和a.weight> 20),请使用以下代码:

B.objects.filter(a__price__lt=10, a__weight__gt=20, c__d=F('d'))

或者这个:

B.objects.filter(a__in=A.objects.filter(price__lt=10, weight__gt=20), c_d=F('d'))

2)如果你只有一个A对象的python列表,请使用:

B.objects.filter(a__pk__in=[a.pk for a in your_a_list], c__d=F('d'))