Django迅速获得一对多关系的最新信息

时间:2016-12-17 22:24:29

标签: python django one-to-many

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

class Artist(models.model):
    pass

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

我只想在他们最新的Artist页面上显示几百TrackArtist。我可以快速获取所有Track s,但是当有数千首曲目时,获取最新的latest_track = artist.track_set.latest('when') # really expensive 证明是昂贵的。

Artist#latest_track

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

我还考虑过使用var oldLog = console.log; console.log= function(){ var d= new Date(), dateString = // process string ..... for(var i = 0; i<arguments.length; i++){ oldLog(dateString, arguments[i]); } } ,但我没有办法在合适的时间使缓存无效。此外,{{1}}似乎只在运行时设置,所以如果我重新启动我的应用服务器,它将需要重做所有查询。

我在这做什么?

1 个答案:

答案 0 :(得分:1)

我打赌你只需要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调试工具栏,数据库日志),看看发生了什么,通常情况下缓慢来自你期望的地方。