2010-03-23 10 views
35

Dies ist mit ziemlicher Sicherheit eine doppelte Frage, in diesem Fall entschuldigt sich, aber ich habe etwa eine halbe Stunde auf SO gesucht und kann die Antwort hier nicht finden. Ich benutze wahrscheinlich die falschen Suchbegriffe, sorry.Reihenfolge nach Anzahl eines ForeignKey-Feldes?

Ich habe ein Benutzermodell und ein Submissionsmodell. Jede Einreichung hat ein ForeignKey-Feld namens user_submitted für den Benutzer, der sie hochgeladen hat.

Meine Frage ist ziemlich einfach: Wie bekomme ich eine Liste der drei Benutzer mit den meisten Einreichungen?

Ich versuchte, eine num_submissions Methode auf dem User-Modell zu erstellen:

def num_submissions(self): 
    num_submissions = Submission.objects.filter(uploaded_by=self).count() 
    return num_submissions 

und dann tun:

top_users = User.objects.filter(problem_user=False).order_by('num_submissions')[:3] 

Aber dies nicht gelingt, wie auch all die anderen Dinge, die ich ausprobiert habe. Kann ich das mit einer intelligenten Datenbankabfrage tun? Oder sollte ich etwas Hacky in der Sichten-Datei machen?

Antwort

84
from django.db.models import Count 
top_users = User.objects.filter(problem_user=False) \ 
       .annotate(num_submissions=Count('submission')) \ 
       .order_by('-num_submissions')[:3] 

Sie erwähnen in Ihrem Beispiel Modellcode nicht problem_user, aber ich habe es in der Annahme verlassen, dass es ein BooleanField auf User ist.

+2

Sehr schön, es funktioniert Ereignis mit 'Profile.objects.annotate (num_items = Count ('user__item')). Order_by ('- num_items')' – skrat

+0

Hallo, ich möchte fragen, ob es eine Möglichkeit gibt zu filtern nur die Benutzer mit den meisten Einreichungen in den letzten 24 Stunden? Angenommen, es gibt ein Timestamp-Feld in Submission. –

Verwandte Themen