我有一个非常基本的“新闻Feed”页面,它使用通用关系,使用以下模型:
class RecentActivity(models.Model):
event_type = models.IntegerField(choices=EVENT_TYPES)
timestamp = models.DateTimeField()
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
credits = models.ManyToManyField('videos.VideoCredit', blank=True)
我正在使用信号来监听创建对象的时间,并在显示之前检查以确保它在视图中存在(即,它没有被删除)。这是一个非常基本的页面,只有几十行代码来生成它。但是,它产生了大量的数据库查询!在大约20个最近活动对象的页面上,它需要大约120个查询,我估计它最多可以查询大约200个查询。
解决这个问题的最佳方法是什么?我主要关注的不是减少查询数量,而是尽可能快地加载页面。 (我的第一个想法是反规范化。)
请注意,该页面不是每用户动态的,但对所有用户都是相同的。谢谢。
答案 0 :(得分:3)
很难说没有更多信息,但我采取的通常步骤是:
查看您的模型,您可能正在访问content_type,然后访问内容对象。如果你完全遵循学分,你就可以轻松地达到这个数量的查询。
答案 1 :(得分:0)
绝对使用django-debug-toolbar查看正在执行的查询,并确保查询数量不会随着您显示的元素对象数量线性增长。
一旦您将查询数量减少到最佳能力,请尝试使用Django缓存系统并缓存导致速度缓慢的视图或模板片段。