Django 过滤特定 QuerySet.values()

5 投票
2 回答
22430 浏览
提问于 2025-04-20 06:13

假设我有一个模型类叫做 Parent,还有一个类叫做 Child。这个 Child 类里有一个叫 status 的字段,并且它和 Parent 之间有一个外键关系。

现在我通过调用 p = Parent.objects.filter(pk=1) 来获取一个父类的实例,这样我就得到了一个查询集。

接下来,如果我调用 p.values('children__name'),我会得到一个字典列表,里面是这个父类所有孩子的名字。

我的问题是,如果我想调用 p.values('children__name'),但只想获取那些 status 符合特定条件的孩子的名字,我该怎么做呢?

我还想确保原来的查询集不被改变,因为我不想对它进行筛选(特别是当查询集很大的时候)。我只是想根据某些条件来过滤值。

在 Django 中有没有办法做到这一点呢?

2 个回答

0

你可以通过使用 Prefetch 来过滤多对多关系中的子值。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')

或者使用一个已经存在的查询集 p:

names = Parent.children.through.objects.filter(parent_id__in=p, child_status='SICK').values('children__name')

关于多对多关系的更多信息,可以在 这里 找到。

11

你只需要进行过滤:

p.filter(children__status='whatever').values('children__name')

撰写回答