我们说我有一个模型类Parent
和一个类Child
。并且孩子有一个名为status
的字段和ForeignKey
与Parent
的关系。
假设我通过调用p = Parent.objects.filter(pk=1)
现在,如果我打电话给p.values('children__name')
,我会收到一份包含该父母姓名字典的列表。
我的问题是,如果我想拨打p.values('children__name')
,但只有当孩子的status
具体时才限制价值,我该怎么做?
我还想确保原始QuerySet不变,因为我不想过滤它(对于更大的QuerySet)。我只想过滤基于某个参数的值。
有没有办法在Django中这样做?
答案 0 :(得分:4)
您只需过滤:
p.filter(children__status='whatever').values('children__name')
答案 1 :(得分:0)
您可以使用“预取”来过滤M2M关系上的子值。 Prefetch指定如何从父级和子级之间的穿透表获取数据,并且prefetch_related触发实际查询。
from django.db.models import Prefetch
pf = Prefetch('children', Child.objects.filter(status='SICK')
parents = Parent.objects.filter(pk=1).prefetch_related(pf)
sick_children_names = []
for parent in parents:
sick_children_names.append([child.name for child in parent.children.all()])
另一种方法是使用穿透表本身。
names = Parent.children.through.objects.filter(parent_id=1, child__status='SICK').values('children__name')
或具有现有qs p:
names = Parent.children.through.objects.filter(parent_id__in=p, child_status='SICK').values('children__name')
通过here到M2M的更多信息