2016-05-19 8 views
0

Blick auf die folgende Szenario zählen:Wie kann man vermeiden N + 1, wenn in django

Ich habe ein User Modell und ein Address Modell, das auf Benutzer gehört. Im Benutzerindex muss ich zusammen mit den Benutzerinformationen anzeigen, wie viele Adressen der Benutzer hat, aber es generiert N + 1 Abfragen, da jedes Mal, wenn ich count aufruft, eine zusätzliche Abfrage für diese Benutzer-ID ausgeführt wird.

Wie kann ich das tun? Ich lese über select_related aber ich versuche es in der umgekehrten Reihenfolge ...

In SQL, um es zu übersetzen könnte:

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

Gibt es eine Möglichkeit, die oben SQL mit django QuerySet zu erhalten ?

Antwort

3

Sie die Anzahl der Adressen annotate können, haben Sie Ihre Modelle nicht gezeigt, aber Sie können

Docs auf für jedes Ergebnis die folgenden Funktionen Ihres queryset

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

Dies würde eine address_count Eigenschaft für count

+0

herrlich! das ist genau das, was ich will, danke! –

+0

@IgorBelo - Keine Sorge, viel Spaß! – Sayse

Verwandte Themen