django:select_related()在已经存在的对象上?

Cla*_*diu 7 python sql database django performance

如果我使用django检索对象,我可以.select_related()用来指示django获取所有外键对象,例如:

obj = ModelClass.objects.select_related().get(id=4) #1 db hit
foo = obj.long.chain.of.stuff #no db hit
Run Code Online (Sandbox Code Playgroud)

如果我已经拥有obj,没有它.select_related(),那就是:

def doit(obj):
    obj.long.chain.of.stuff #4 db hits
Run Code Online (Sandbox Code Playgroud)

有没有办法让django填补所有的外键关系?就像是:

def doit(obj):
    obj.magic() #1 db hit
    obj.long.chain.of.stuff #no db hits
Run Code Online (Sandbox Code Playgroud)

Cla*_*diu 6

我想我可以这样做:

def doit(obj):
    obj = obj.__class__.objects.select_related().get(id=obj.id) #1 db hit
    obj.long.chain.of.stuff #no db hits
Run Code Online (Sandbox Code Playgroud)

但是有没有更好的方法呢?

  • 我认为这将是你唯一的方法。不过,我会确保对那段代码进行注释,这样以后查看它的任何人都不会挠头想知道为什么要这样做,或者更糟的是,删除它,因为它看起来多余。 (2认同)