1
我在Django QuerySet中調用annotate
時遇到了一些性能問題。讓我用一個例子來解釋我的問題。說我在我的模型,這樣的外鍵關係:Django - 通過註釋提高查詢集的性能
def Blog(models.Model):
owner = models.ForeignKey(User)
title = models.CharField()
def BlogArticle(models.Model):
blog = models.ForeignKey(Blog)
title = models.CharField()
body = models.CharField()
timestamp = models.DateTimeField()
現在,說我想的基礎上,博客文章的時間戳的最後10個更新博客的列表。我能做到這一點有:
latest_updates = Blog.objects.annotate(updated=Max('blogarticle__timestamp')).order_by('-updated')[:10]
這工作,但速度很慢與MySQL有大量的數據(剖析查詢顯示「複製到tmp下表」一步走很長的時間,但這是另一個話題)。
到目前爲止,我認爲以下幾點:
- 添加一個「更新」
DateTimeField
到Blog
並添加一個信號或save
覆蓋,以保持這一領域的同步與該Blog
最新BlogArticle
。這對性能會很好,但是違背了DRY原則。 - 查詢最近10次更新的
BlogArticle
型號,並使用它查詢Blog
型號。但是,只有在最近10次更新全部來自不同的博客時,這纔會起作用。
任何其他想法來優化此查詢?