2010-09-25 24 views
6

Temelde "X türündeki tüm öğeleri sayın ve sayımlarla birlikte bir kereden fazla var olan öğeleri döndürün" sorgusu var. Şimdilik şu şu özelliklere sahibim:Django ORM ile sayımda filtreleme

Ancak hiçbir şey döndürmez (tüm öğeler için sayı 1'dir). Neyi yanlış yapıyorum? böylece count == 1 eğer olmayacak

type_count__gt=1type_count > 1 anlamına gelir);

Type, Count 
----------- 
1  2 
3  3 
+0

Modellerinizi gösterebilir misiniz? –

+0

Yapabilirim, ama ilgili bit sadece "tip" bir alana sahip bir "Öğe" modeli var ... –

cevap

15

Her türün oluşum sayısını saymak için, type alanına göre gruplandırmanız gerekir. Django'da, bu alanı almak için values kullanılarak yapılır. Yani, bu işe yarar:

Item.objects.values('group').annotate(
    type_count=models.Count("type") 
).filter(type_count__gt=1).order_by("-type_count") 
+0

yea - bu doğru, ama 'group' yerine 'type 'yazın :) gibi bir şey döndürecektir: [{' type ': u'X', 'type_count': 2}] - neden söylemedim daha önce :) – bx2

+0

Bence "grup" yerine "tip" demek istediniz, * __gt parçası olmadan bunu yaptım *, ancak __gt parçası ile "dict nesnesinin type_count özelliği yok" atar bana bir sütun olarak erişmeye çalıştığını söylüyor ... –

+0

Bu garip - Ben kontrol ettim ve bir çekicilik gibi çalışır. Btw. Dict'ta hiçbir type_count attr hakkında söylendiğinde, toplama tarafından oluşturulan bir diksiyon anlamına gelir - bir sütun gibi erişmeye çalışmaz. Sonuçlar yukarıda yazdığım gibi olmalı. Emin olmak için django kabuğunda kontrol edin. – bx2

2

O var mantık hatası:

Type 
---- 
1 
1 
2 
3 
3 
3 

ve dönüş:

İdeal aşağıdaki almalısınız görüntülendi :) type_count__gte=1 kullanın - bunun anlamı type_count >= 1 :)

+0

Sadece sayım * daha fazla olanları istiyorum * daha *, bu doğru ... –

+0

evet ama sen sayım her biri için 1 olduğunu - hiçbir şey görüntülenmemesinin nedeni budur :) – bx2

+0

Yinelenen türleri vardır, ancak her şey için sayı 1'dir. Bu yanlıştır, ama neden sayımın doğru olmadığını bilmiyorum bir. –