Django过滤特定的QuerySet.values()

时间:2014-09-07 08:31:50

标签: python django django-queryset

我们说我有一个模型类Parent和一个类Child。并且孩子有一个名为status的字段和ForeignKeyParent的关系。

假设我通过调用p = Parent.objects.filter(pk=1)

调用filter(以便拥有QuerySet)来检索一个父项

现在,如果我打电话给p.values('children__name'),我会收到一份包含该父母姓名字典的列表。

我的问题是,如果我想拨打p.values('children__name'),但只有当孩子的status具体时才限制价值,我该怎么做?

我还想确保原始QuerySet不变,因为我不想过滤它(对于更大的QuerySet)。我只想过滤基于某个参数的值。

有没有办法在Django中这样做?

2 个答案:

答案 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的更多信息