我的模型结构的一个简化示例是
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
,但我无法得到我需要的结果。
理想情况下,Corporation
查询集中的每个都应该用一个整数注释,该整数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
""")