在Django中过滤多对多关系

Was*_*sim 7 django django-models

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

A类:
b = models.ManyToManyField("B")
Run Code Online (Sandbox Code Playgroud) B级:
c = models.ForeignKey("C")
d = models.ForeignKey("D")
Run Code Online (Sandbox Code Playgroud) C级:
d = models.ForeignKey("D")
Run Code Online (Sandbox Code Playgroud)

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

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

bObjects = A.objects.all().b

q = bObjects.filter(c__d=None)
Run Code Online (Sandbox Code Playgroud)

这是有效的,它给了我所有带有Noned字段的c对象.但是,当我尝试以下内容时:

q = bObjects.filter(c__d=d)
Run Code Online (Sandbox Code Playgroud)

它给了我没有定义,但d是对象B中的c之类的对象.

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

Ant*_*ins 6

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

试试这个:

from django.db.models import F
q = bObjects.filter(c__d=F('d'))
Run Code Online (Sandbox Code Playgroud)

至于下面你的评论中的问题,你可以通过以下方式获得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'))
Run Code Online (Sandbox Code Playgroud)

或这个:

B.objects.filter(a__in=A.objects.filter(price__lt=10, weight__gt=20), c_d=F('d'))
Run Code Online (Sandbox Code Playgroud)

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

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