【发布时间】:2018-12-04 03:36:56
【问题描述】:
我的模型结构的简化示例是
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 进行注释,该整数反映了该类型部门的数量。
我确信我可以在 .extra() 中使用原始 sql 做一些事情,但文档宣布它将被弃用(我在 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
""")
【问题讨论】:
标签: django django-annotate django-subquery