2012-10-30 12 views
32

mam dwa modele zdefiniowane luźno tak:Django opisywanie liczyć z odrębną dziedzinę

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

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

Teraz w widoku, chcę opisywać wszystkie InformationUnits należące do projektu, więc mogę to zrobić:

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

który działa tylko ok Ponadto, chcę wiedzieć, w każdym projekcie, ile odrębne „username” uczestniczą. To znaczy policz, ile różnych "nazw użytkownika" znajduje się w jednostkach InformationUnits tworzących jeden projekt. Próbowałem następujących, ale to po prostu zlicza liczbę InformationUnit, bez względu na nazwę użytkownika:

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

Należy pamiętać, że nazwa nie jest obiektem, jest to ciąg znaków. Czy jest na to czysty sposób, czy powinienem stworzyć bardziej skomplikowany kod oparty na pętlach i kodzie spaghetti: P

Wielkie dzięki!

Odpowiedz

54

Count może zająć distinct argumentu, tak:

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

To nie wydaje się być udokumentowane, ale można go znaleźć w źródle dla hrabiego.

+0

To zadziałało! Znalazłem to gdzieś, a nawet wypróbowałem (faktycznie to była ostatnia rzecz, którą zrobiłem, zanim zadałem pytanie tutaj). Na początku nie działało, ale wypróbowałem to jeszcze raz, po ponownym uruchomieniu serwera programistycznego i to się udało: P Wielkie dzięki! – fenomenoxp

+0

Jest to dokumentowane (teraz, tak czy inaczej): 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

za to do pracy, nie powinny nazwa użytkownika musi być dziedziną projektu? – fenomenoxp

+0

Próbowałem, ale to się nie udało, ponieważ nazwa użytkownika nie jest polem projektu. – fenomenoxp

+0

Może to potwierdzić dla django 1.7 – rix

6

Jeśli chcesz po prostu policzyć odrębne wartości, można użyć odrębny() i count() funkcje:

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

Dziękuję, właśnie tego szukałem dla. Przyjmowana odpowiedź zwraca listę obiektów. Twoje rozwiązanie sprawdziło się u mnie. – allardbrain

Powiązane problemy