django:对已存在对象使用select_related()?

10 投票
1 回答
1444 浏览
提问于 2025-04-17 06:27

如果我在使用Django获取一个对象,我可以用 .select_related() 来告诉Django同时获取所有的外键对象,具体来说就是:

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

如果我已经有了 obj,但没有使用 .select_related(),也就是说:

def doit(obj):
    obj.long.chain.of.stuff #4 db hits

有没有什么办法可以让Django填充它所有的外键关系?类似于:

def doit(obj):
    obj.magic() #1 db hit
    obj.long.chain.of.stuff #no db hits

1 个回答

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

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

撰写回答