Django 过滤特定 QuerySet.values()
假设我有一个模型类叫做 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')