在 Django 中联合动态数量的查询集

In Django Unite a Dynamic Amount of QuerySets

在我的 django 应用程序中,我有一个包含“UnitNodes”、“Persons”和“PersonUnitRelations”的模型。我希望 select 所有与单位列表相关的人。我认为如果我只能在一个数据库查询中执行操作,那将是最有效的。所以我想出了一些类似于这样的代码:

from models import Person
from django.db.models import Q
from models import UnitNode

unitqs = UnitNode.objects.order_by('translations__title').filter(Q(translations__title__icontains="ceres"))
unit = unitqs[0]
qs = Person.objects.filter(personunitrelation__unit_node=unitqs[0])
for unit in unitqs:
    qs2 = Person.objects.filter(personunitrelation__unit_node=unit)
    qs = qs.union(qs2)

这会创建一些大型查询,我想知道是否有更好的方法。

两个查询

是的,只需使用 __in [Django-doc] 查找:

qs = Person.objects.filter(personunitrelation__unit_node<b>__in=unitqs</b>)

这十个结果如下:

SELECT p.*
FROM person AS p
JOIN personunitrelation AS pur ON pur.person_id = p.id
WHERE pur.unit_node_id IN (14, 25)

其中 1425 在这里是 假设的 id UnitNode 的。因此,这将进行两次查询:一次获取 UnitNodes,一次获取 Persons.

一次查询

如果您对 unitqs 不感兴趣,您甚至可以在这里将其设为 单个 查询:

Person.objects.filter(
    personunitrelation__unit_node<b>__translations__title__icontains="ceres"</b>
)

这将导致如下结果:

SELECT p.*
FROM person AS p
JOIN personunitrelation AS pur ON pur.person_id = p.id
JOIN unit_node AS un ON pur.unit_node = un.id
JOIN ON translation AS t ON t.unit_node = un.id
WHERE t.title LIKE '%ceres%'

(简化版)