Полный эквивалентный запрос будет выглядеть следующим образом:
Animals.objects.filter(
master_id=1
).values('color', 'shape', 'eyes').annotate(
ct=Count('id')
).order_by('color', 'shape', 'eyes')
В результате будет получен QuerySet
со словарями, например:
<QuerySet [
{ 'color': 0, 'shape': 2, 'eyes': 1, 'ct': 1 },
{ 'color': 0, 'shape': 3, 'eyes': 3, 'ct': 4 },
{ 'color': 1, 'shape': 0, 'eyes': 0, 'ct': 2 },
{ 'color': 2, 'shape': 2, 'eyes': 1, 'ct': 5 },
]>
Например:
>>> Animals.objects.create(color='foo', shape='bar', eyes='brown', master_id=1)
<Animal: Animal object (2)>
>>> Animals.objects.create(color='foo', shape='bar', eyes='brown', master_id=1)
<Animal: Animal object (3)>
>>> Animals.objects.create(color='foo', shape='bar', eyes='blue', master_id=1)
<Animal: Animal object (4)>
>>> Animals.objects.create(color='foo', shape='rectangle', eyes='brown', master_id=1)
<Animal: Animal object (5)>
>>> Animals.objects.create(color='red', shape='rectangle', eyes='brown', master_id=1)
<Animal: Animal object (6)>
>>> Animals.objects.filter(
... master_id=1
... ).values('color', 'shape', 'eyes').annotate(
... ct=Count('id')
... ).order_by('color', 'shape', 'eyes')
<QuerySet [{'color': 'foo', 'shape': 'bar', 'eyes': 'blue', 'ct': 1}, {'color': 'foo', 'shape': 'bar', 'eyes': 'brown', 'ct': 2}, {'color': 'foo', 'shape': 'rectangle', 'eyes': 'brown', 'ct': 1}, {'color': 'red', 'shape': 'rectangle', 'eyes': 'brown', 'ct': 1}]>