Заказ записей по количеству комментариев с django - PullRequest
1 голос
/ 21 ноября 2011

Мне нужно получить записи из базы данных с количеством комментариев. Могу ли я сделать это с рамкой комментариев django? Я также использую приложение для голосования, которое не использует GenericForeignKeys, я получаю записи с такими оценками:

class EntryManager(models.ModelManager):
    def get_queryset(self):
        return super(EntryManager,self).get_queryset(self).all().annotate(\
            score=Sum("linkvote__value"))

Но когда есть иностранные ключи, я застреваю. У вас есть идеи по этому поводу?

дополнительное объяснение: мне нужно получить записи вроде этого:

id | body | vote_score | comment_score |
 1 |  foo |         13 |             4 |
 2 |  bar |          4 |             1 |

после этого я могу заказать их через comment_score. :)

Спасибо за все ответы.

1 Ответ

1 голос
/ 15 декабря 2011

Очевидно, что аннотирование с помощью обратных родовых отношений (или дополнительных фильтров, в общем) все еще является открытым билетом (см. Также соответствующую документацию ). Пока это не решено, я бы предложил использовать сырой 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, по которой вы хотите рассчитать свои баллы. В противном случае все будет немного сложнее: вам потребуется подзапрос для извлечения идентификатора типа контента для типа каждого аннотированного объекта.

...