2016-05-19 135 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