Django 快速获取最新的一对多关系

Django quickly get latest in one to many relation

我在 Django 中有一个这样的模型

class Artist(models.model):
    pass

class Track(models.model):
    artist = models.ForeignKey(Artist, on_delete=models.CASCADE)

我只有几百个 Artist 要与最新的 Track 一起显示在页面上。我可以快速获取所有 Artist,但事实证明,当有数千首曲目时,获取最新的 Track 非常昂贵。

latest_track = artist.track_set.latest('when') # really expensive

我向艺术家添加曲目的方式允许我轻松地设置艺术家的最新曲目(即我不必担心多个线程)。这让我觉得我应该只存储一个字段 Artist#latest_track,但我不知道如何建模,因为它不是真正的 OneToOneField,这是我能找到的最接近的东西。

我也考虑过使用cached_property,但是我没有好的方法在正确的时间使缓存失效。此外,cached_property 似乎只在运行时设置,因此如果我重新启动我的应用程序服务器,它将需要重做所有查询。

我在这里做什么?

我打赌你只需要 prefetch_related 艺术家:

for artist in Artist.objects.all().prefetch_related('track_set'):
    latest_track = artist.track_set.latest('when') #should be no db hit

如果它仍然很慢,您需要检查生成的 sql(django 调试工具栏,数据库日志)并查看发生了什么,通常缓慢的原因不是您预期的。