【发布时间】:2014-08-03 11:52:32
【问题描述】:
我有一种情况,我想为主题列表中的每个主题获取最受欢迎的评论。就目前而言,我正在 for 循环中进行查询,可以预见这会很慢。有没有办法消除由此产生的大量查询?
使用 Django 的 prefetch_related queryset 方法是不可接受的,因为它会检索与线程相关的所有 cmets(可能很多)。这尤其成问题,因为我每个线程只需要一条评论(只有最受欢迎的一条)。
这是我的模型的简化版本(为简洁起见,删除了一堆不相关的信息)。
class Thread(models.Model):
def description(self):
""" Returns most popular post based on votes. """
return self.posts.annotate(_popularity=models.Count('votes')).order_by('-_popularity')[0]
class Post(models.Model):
thread = models.ForeignKey('Thread', related_name='posts')
text = models.CharField(max_length=settings.MAX_POST_LENGTH)
class Vote(models.Model):
post = models.ForeignKey('Post', related_name='votes')
获取所有描述的代码实际上就是这个。 threads 是 Thread 对象的已评估查询集。
def descriptions(threads):
for thread in threads:
yield thread.description()
所以基本上我有一些线程,我希望得到一个列表,其中包含每个线程最流行的评论。我希望使用少于 N 的查询来执行此操作,其中 N 是线程数。
【问题讨论】:
-
你碰巧在使用 Postgres 吗?
-
在生产中是的,尽管我使用 SQLite 进行开发。
标签: python django query-optimization django-queryset querying