我在Django中有一个像这样的模型
class Artist(models.model):
pass
class Track(models.model):
artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
我只想在他们最新的Artist
页面上显示几百Track
个Artist
。我可以快速获取所有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}}似乎只在运行时设置,所以如果我重新启动我的应用服务器,它将需要重做所有查询。
我在这做什么?
答案 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调试工具栏,数据库日志),看看发生了什么,通常情况下缓慢来自你期望的地方。