【发布时间】:2014-12-29 20:33:49
【问题描述】:
这是简化的问题,我有一个 Book 模型:
class Book(models.Model):
language = models.CharField(max_length=2, choices=LANGUAGE_CHOICES)
...
我正在使用django-hitcount 来计算我的 Books 的浏览量(可能没有人知道它,因为它是一个旧项目),无论如何让我粗略地总结一下:它创建了一个带有命中计数器和 GenericForeignKey 的 HitCount 对象相应的对象。
我想得到 15 本书的点击次数更多的某种语言的书籍,显然是按点击次数排序的。
我已经查看了this question,它帮助我找出了我的(部分)解决方案,分为 3 个查询:
- 获取某种语言的所有图书 ID;
- 获取同样在第一个列表中的前 15 个 HitCounts related_object 的 ID;
- 获取具有在步骤 2 中获取的 ID 的图书;
翻译成代码:
content_type = ContentType.objects.get_for_model(Book)
books = tuple(Books.objects.filter(
language=language).values_list('id', flat=True))
all_time = list(HitCount.objects.filter(
content_type=content_type,
object_pk__in=books).values_list(
'object_pk', 'hits').order_by('-hits')[:15])
all_time_ids = [i[0] for i in all_time]
best_of_all_time = Books.objects.select_related(
'manga').filter(pk__in=all_time_ids)
这种方法存在两个问题:
- 对于大型数据库(如我的),第二个查询变得非常昂贵;
- 在最后一个查询中,我失去了第二个查询命中的订单;
有人有什么建议吗?
【问题讨论】:
标签: python django generic-foreign-key