在 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)
其中 14
和 25
在这里是 假设的 id
UnitNode
的。因此,这将进行两次查询:一次获取 UnitNode
s,一次获取 Person
s.
一次查询
如果您对 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%'
(简化版)
在我的 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)
其中 14
和 25
在这里是 假设的 id
UnitNode
的。因此,这将进行两次查询:一次获取 UnitNode
s,一次获取 Person
s.
一次查询
如果您对 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%'
(简化版)