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

Posted

技术标签:

【中文标题】django: select_related() 在一个已经存在的对象上?【英文标题】:django: select_related() on an already-existing object? 【发布时间】:2011-12-30 17:11:43 【问题描述】:

如果我正在使用 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】:

我想我可以做到:

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

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

【讨论】:

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

以上是关于django: select_related() 在一个已经存在的对象上?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用'select_related'从相关(ForeignKey)django模型中接收并非所有字段

Django:select_related() 的用法和执行时间性能

django 2.1 上的 select_related 不工作

如何在模板 Django 中使用 select_related?

Django中的左外反向select_related?

Django 通用外键和 select_related