Django

2012-10-30 13 views
32

böyle gevşek tanımlanmış iki model var ayrı bir alanla sayımı açıklama: ArtıkDjango

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

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

, bir görünümde, bir projeye ait olan tüm InformationUnits açıklama istiyoruz, bu yüzden bunu yapmak: ayrı 'kullanıcı adı' katılmak kaç her proje, içinde, Dahası, bilmek istiyorum sadece Tamam çalışan

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

. Yani, bir projeyi oluşturan InformationUnits'te kaç tane 'kullanıcı adı' var. Ben aşağıdaki denedi, ama sadece kullanıcı adı ne olursa, InformationUnit sayar: username bir nesne olmadığını

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

Not, bu bir dizidir. Bunu yapmak için temiz bir yol var mı yoksa döngülere ve spagetti koduna dayanan daha karmaşık bir kod oluşturmalı mıyım: P

Çok teşekkürler!

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

Bu belgelendirilmesi görünmüyor, ancak Kont'unu kaynağında bulabilirsiniz:

cevap

54

Count şöyle bir distinct argüman alabilir. Sadece ayrı değerleri saymak istiyorsanız

+0

ile çalışır onaylayın Bu işe yaradı! Bunu bir yerlerde buldum ve hatta denedim (aslında soruyu sormadan önce yaptığım son şey buydu). Başlangıçta işe yaramadı, ancak bugün geliştirme sunucusunu yeniden başlattıktan sonra tekrar denedim ve hile yaptı: P Çok teşekkürler! – fenomenoxp

+0

(Her halükarda) belgelenmiştir: 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

, projenin bir saha olmak zorunda kullanıcı adınız için olmasın? – fenomenoxp

+0

Denedim, ancak kullanıcı adı Proje – fenomenoxp

+0

bir alan olmadığı için başarısız çünkü django 1.7 – rix

6

, siz) (ayrı kullanabilir ve) (fonksiyonlarını saymak: çalışmalarına bunun için

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

Teşekkür ederim, ben aradığım şey buydu için. Kabul edilen cevap, bir nesne listesi döndürür. Çözümün benim için çalıştı. – allardbrain