выбрать последние комментарии для нескольких объектов одновременно - PullRequest
2 голосов
/ 25 октября 2011

Скажите, что у меня есть модель комментария, подобная этой:

class Comment(models.Model):
    user = models.ForeignKey(User)
    content = models.CharField(max_length=200)
    create_time = models.DateTimeField(blank=True, default=datetime.datetime.now)

    content_type = models.ForeignKey(ContentType, verbose_name=_('content type'))
    object_id    = models.PositiveIntegerField(_('object id'), db_index=True)
    object       = generic.GenericForeignKey('content_type', 'object_id')

Если я могу выбрать несколько последних комментариев для нескольких объектов в одном и том же типе content_type (скажем, «Сообщения» с указанием идентификаторов этих сообщений) в одном запросе?

Если это возможно, как насчет выбора самого старого комментария и последних 4 комментариев для этих объектов в одном запросе?

Thx!

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

У меня были проблемы с greatest-n-per-group проблемой. Мне пришлось перейти на сырой SQL, чтобы получить свои результаты (топ X вопросов на категорию вопросов в моем FAQ). Нет простого способа сделать это через ORM.

Этот пост: использует интересное решение с SQL SQL-соединение: выбор последних записей в отношении один-ко-многим

Мое решение включало подзапросы. Так как вы используете универсальные ключи, это может повлечь за собой немного больше царапин на голове.

В итоге я просто вернулся к ORM с агрессивным кэшированием этого конкретного представления, поэтому я мог бы порекомендовать это. Это слишком большая боль, чтобы поддерживать SQL.

Foo.objects.raw('''
    SELECT ...
    FROM foo
    LEFT OUTER JOIN bar
    ON (foo.bar_id = bar.id ) 
    WHERE foo.id
    IN (
        SELECT subquery.id 
        FROM foo subquery 
        WHERE foo.bar_id = subquery.bar_id
        ORDER BY score DESC
        LIMIT %s
        )
    ORDER BY "baz" DESC;''', [5])
0 голосов
/ 25 октября 2011

Вы упомянули "предоставление идентификаторов этих сообщений", но на самом деле не определена ни одна модель сообщений (по крайней мере, в вашем вопросе).Но, так как вы просите получить все комментарии с одинаковым content_type, я не уверен, как нужны сообщения.

Следующий запрос получает все Comment элементы, которые соответствуют ContentTypeс определенным первичным ключом (1) упорядочивает их по create_time и выбирает первые 4 элемента:

Comment.objects.filter(content_type__pk=1).order_by('-create_time')[:4]
...