一次选择多个对象的最新注释

时间:2011-10-25 08:55:51

标签: django django-queryset django-contenttypes

说我有这样的评论模型:

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中的多个对象选择最新的几条评论(比如帖子,给这些帖子的ID)?

如果可能的话,如何在一个查询中为这些对象选择最早的评论和最新的4条评论呢?

THX!

2 个答案:

答案 0 :(得分:4)

我遇到了greatest-n-per-group问题。我不得不放弃原始SQL来获得我的结果(在我的FAQ中每个问题类别的前X个问题)。通过ORM没有简单的方法。

这篇文章:使用一个有趣的SQL解决方案 SQL join: selecting the last records in a one-to-many relationship

我的解决方案涉及子查询。由于您使用的是通用密钥,因此可能会涉及更多的问题。

我最后只是在这个特定的视图上使用激进的缓存回到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])

答案 1 :(得分:0)

你提到“给那些帖子的ID”,但实际上并没有定义任何Post模型(至少在你的问题中)。但是,当您要求使用相同的content_type获取所有评论时,我不确定如何需要帖子。

以下查询获取与Comment匹配某个主键(1)的所有ContentType项,按create_time排序并选择前4项:

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