说我有这样的评论模型:
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!
答案 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]