2012-10-30 9 views
32

Ich habe zwei Modelle losen wie folgt definiert:Django mit Anmerkungen versehen Zählung mit einem eindeutigen Feld

class InformationUnit(models.Model): 
    username = models.CharField(max_length=255) 
    project = models.ForeignKey('Project') 
    ... 

class Project(models.Model): 
name = models.CharField(max_length=255) 

jetzt in einer Ansicht, ich will alle InformationUnits mit Anmerkungen versehen, die zu einem Projekt gehören, so dass ich dies tun:

p = Project.objects.all().annotate(Count('informationunit') 

die Weiterhin nur ok funktioniert, möchte ich in jedem Projekt wissen, wie viele verschiedene ‚username‘ teilnehmen. Zählen Sie, wie viele verschiedene "Benutzernamen" in den Informationseinheiten enthalten sind, aus denen ein Projekt besteht. Ich habe folgendes versucht, aber es zählt einfach die Anzahl der InformationUnit, und zwar unabhängig von dem Benutzernamen:

p = Project.objects.all().annotate(Count('informationunit__username') 

Beachten Sie, dass Benutzername nicht ein Objekt ist, es ist eine Zeichenfolge. Gibt es eine saubere Möglichkeit, dies zu tun, oder sollte ich einen komplizierteren Code basierend auf Schleifen und Spaghetti-Code erstellen: P

Vielen Dank!

Antwort

54

Count kann nehmen distinct Argument, etwa so:

p = Project.objects.all().annotate(Count('informationunit__username', 
             distinct=True)) 

Das ist nicht dokumentiert zu sein scheint, aber man kann es in der Quelle für die Grafen finden.

+0

Es hat funktioniert! Ich hatte das irgendwo gefunden und es sogar versucht (eigentlich war es das letzte, was ich getan habe, bevor ich die Frage hier gestellt habe). Am Anfang funktionierte es nicht, aber nach dem Neustart des Entwicklungsservers versuchte es es heute wieder und es schaffte den Trick: P Vielen Dank! – fenomenoxp

+0

Es ist dokumentiert (jetzt, jedenfalls): https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.Count.distinct –

6
Project.objects.all().annotate(Count('informationunit__username', 
            distinct=True)) 
+0

dafür zu arbeiten, sollte ein Bereich Projekt sein müssen nicht username? – fenomenoxp

+0

Versucht es, aber es scheitert, weil Benutzername kein Feld des Projekts ist – fenomenoxp

+0

Kann bestätigen, dass dies mit Django 1.7 funktioniert – rix

6

Wenn Sie nur die unterschiedlichen Werte zählen möchten, können Sie den eindeutigen() und count() Funktionen:

count = Project.objects.values('informationunit__username').distinct().count() 
+0

Danke, das ist, was ich gesucht habe zum. Die akzeptierte Antwort gibt eine Liste von Objekten zurück. Deine Lösung hat für mich funktioniert. – allardbrain

Verwandte Themen