I know Django 1.1 has some new aggregation methods. However I couldn't figure out equivalent of the following query:
SELECT player_type, COUNT(*) FROM players GROUP BY player_type;
Is it possible with Django 1.1's Model Query API or should I just use plain SQL?
-
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__countThis 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
valuesmethod:from django.db.models import Count q = Player.objects.values('playertype').annotate(Count('games')).order_by() print q[0] print q[0].games__countorder_by()is needed because fields that are in the default ordering are automatically selected even if they are not explicitly passed tovalues(). This call toorder_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__countAlex Koshelev : This call will produce wrong `GROUP BY` clause - with all model fields included. But author asked only one field grouping.Ayman Hourieh : I was trying to give a general example and point to the documentation. This is why I said that my snippet needed tweaking. I've added more examples to my answer now. Thanks for the comment. :) -
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_typefield intoGROUP BYclause.order_by()- for exclusion possible default ordering that can cause not needed fields inclusion inSELECTandGROUP BY.
0 comments:
Post a Comment