2014-04-06 2 views
1

Django 1.3, Python 2.7Джанго подсчитывать аннотацию полю

У меня есть следующие модели (некоторые несущественные поля опущены):

class Encounter(models.Model): 
    subject = models.ForeignKey('Subject', to_field='uuid') 
    uuid = models.SlugField(max_length=36, unique=True, default=make_uuid, editable=False) 

class Subject(models.Model): 
    uuid = models.SlugField(max_length=36, unique=True, default=make_uuid, editable=False) 

Я вычислил число встреч на тему, используя следующий код:

e_in_s = Subject.objects.annotate(revcount = Count('encounter')).order_by('-revcount') 

Теперь я хотел бы знать, сколько предметов имеет ровно revcount встреч для каждого значения revcount. Я попытался следующие:

sprime_in_e = e_in_s.values('revcount').annotate(countprime=Count('revcount')) 

но получил сообщение об ошибке «Не удается вычислить графа („revcount“):„revcount“представляет собой совокупность». Какие-либо предложения?

Примечание: Мне нужно значение, выраженное e_in_s, а также его аннотация.

ответ

2

Вы не можете использовать аннотацию с аннотированными значениями. Однако вы можете использовать aggregate. See the docs.

Ваши запросы будут выглядеть следующим образом:

e_in_s = Subject.objects.annotate(revcount = Count('encounter')).order_by('-revcount') 
sprime_in_e = e_in_s.values('revcount').aggregate(countprime=Count('revcount')) 

Если этого не достаточно, вам нужно использовать функцию extra или выпадающие к сырому SQL.