在django中计数时如何避免N + 1

时间:2016-05-19 19:59:27

标签: django

查看以下场景:

我有User模型和属于用户的Address模型。

在用户索引中,我需要显示用户的信息,用户拥有多少个地址,但是每次调用count时,它都会生成N + 1个查询,因为它会对该用户ID执行额外的查询。

我该怎么做?我读到select_related,但我试图按相反的顺序进行...

在SQL中,它可以翻译为:

SELECT user.*,
(SELECT count(*) FROM address WHERE address.user_id = user.id) AS address_count
FROM user

有没有办法用django QuerySet获取上面的SQL?

1 个答案:

答案 0 :(得分:3)

你可以annotate地址数量,你没有展示你的模型,但你可以在你的查询集上使用以下内容

.annotate(address_count=Count('address'))
User.objects.all().annotate(address_count=Count('address'))  # Im guessing you want this

这将为每个结果提供address_count属性

count的文档