65👍
If you are using Django 1.1 beta (trunk):
Player.objects.values('player_type').order_by().annotate(Count('player_type'))
values('player_type')
– for inclusion onlyplayer_type
field intoGROUP BY
clause.order_by()
– for exclusion possible default ordering that can cause not needed fields inclusion inSELECT
andGROUP BY
.
16👍
Django 1.1 does support aggregation methods like count. You can find the full documentation here.
To answer your question, you can use something along the lines of:
from django.db.models import Count
q = Player.objects.annotate(Count('games'))
print q[0]
print q[0].games__count
This will need slight tweaking depending on your actual model.
Edit: The above snippet generates aggregations on a per-object basis. If you want aggregation on a particular field in the model, you can use the values
method:
from django.db.models import Count
q = Player.objects.values('playertype').annotate(Count('games')).order_by()
print q[0]
print q[0].games__count
order_by()
is needed because fields that are in the default ordering are automatically selected even if they are not explicitly passed to values()
. This call to order_by()
clears any ordering and makes the query behave as expected.
Also, if you want to count the field that is used for grouping (equivalent to COUNT(*)
), you can use:
from django.db.models import Count
q = Player.objects.values('playertype').annotate(Count('playertype')).order_by()
print q[0]
print q[0].playertype__count
- [Django]-Django return file over HttpResponse – file is not served correctly
- [Django]-How to change empty_label for modelForm choice field?
- [Django]-How to test custom template tags in Django?