2016-05-19 107 views
0

看看以下情形时:如何避免N + 1在Django计数

我有一个User模型,属于用户的Address模型。

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

我该怎么做?我读到select_related但我试图使它以相反的顺序...

在SQL它可以被翻译为:

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

有没有办法让Django的查询集上面的SQL ?

回答

3

可以annotate地址的数量,你有没有显示你的模型,但你可以用你的查询集

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

下面这对每个结果

文档提供address_count财产为count

+0

精彩!这正是我想要的,谢谢! –

+0

@IgorBelo - 不用担心,尽情享受吧! – Sayse