我的模型结构的一个简化示例是
class Corporation(models.Model):
...
class Division(models.Model):
corporation = models.ForeignKey(Corporation)
class Department(models.Model):
division = models.ForeignKey(Division)
type = models.IntegerField()
现在,我想显示一个显示公司的表,其中一列将包含特定类型的部门数,例如。
type=10
.目前,这是通过
Corporation
检索这些数据的模型,例如
class Corporation(models.Model):
...
def get_departments_type_10(self):
return (
Department.objects
.filter(division__corporation=self, type=10)
.count()
)
这里的问题是,这绝对是谋杀的表现,由于N+1的问题。
我试着用
select_related
,请
prefetch_related
,请
annotate
,和
subquery
但是我没能得到我需要的结果。
理想情况下,每个
公司
在查询集中,应使用整数注释
type_10_count
它反映了这类部门的数量。
我相信我可以用原始SQL做点什么
.extra()
但是文档宣布它将被否决(我在Django 1.11上)
编辑:原始SQL解决方案示例
corps = Corporation.objects.raw("""
SELECT
*,
(
SELECT COUNT(*)
FROM foo_division div ON div.corporation_id = c.id
JOIN foo_department dept ON dept.division_id = div.id
WHERE dept.type = 10
) as type_10_count
FROM foo_corporation c
""")