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 调试工具栏,数据库日志)并查看发生了什么,通常缓慢的原因不是您预期的。
我在 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 调试工具栏,数据库日志)并查看发生了什么,通常缓慢的原因不是您预期的。