Очевидно, что аннотирование с помощью обратных родовых отношений (или дополнительных фильтров, в общем) все еще является открытым билетом (см. Также соответствующую документацию ). Пока это не решено, я бы предложил использовать сырой SQL в запросе extra
, например:
return super(EntryManager,self).get_queryset(self).all().annotate(\
vote_score=Sum("linkvote__value")).extra(select={
'comment_score': """SELECT COUNT(*) FROM comments_comment
WHERE comments_comment.object_pk = yourapp_entry.id
AND comments_comment.content_type = %s"""
}, select_params=(entry_type,))
Конечно, вы должны заполнить правильные имена таблиц. Кроме того, entry_type
является «константой», которую можно установить вне вашей функции поиска (см. ContentTypeManager ):
from django.contrib.contenttypes.models import ContentType
entry_type = ContentType.objects.get_for_model(Entry)
Предполагается, что у вас есть одна модель Entry
, по которой вы хотите рассчитать свои баллы. В противном случае все будет немного сложнее: вам потребуется подзапрос для извлечения идентификатора типа контента для типа каждого аннотированного объекта.