DjangoのORMを使用したときの集計関数の使用方法

SQL内で集計をおこなう際に、SQLであれば、「MAX」や「MIN」などと合わせて、「group by」を指定することがある。

ORM使用時は、「group by」を明示的に指定することはないため、少し書き方が違う。

下記のようなモデルがあったとする。

from django.db import models

class test_dogs(models.Model):
    name = models.CharField(max_length=200);
    age = models.IntegerField();
    gender_type = models.CharField(max_length=1); # 1:male,2:female

年齢値のMAXを取りたいとき。

test_dogs.objects.all().annotate(max_id=models.Max('age'));

性別ごとに年齢値のMAXを取りたいとき。

test_dogs.objects.values('gender_type').annotate(max_id=models.Max('age'));