【问题标题】:Why does Django's RelatedManager not cache the object the lookup was called from, on the destination object?为什么 Django 的 RelatedManager 不在目标对象上缓存调用查找的对象?
【发布时间】:2012-02-23 01:07:50
【问题描述】:

如果我有以下型号:

class Fubar(models.Model):
    name = models.CharField()

class Related(models.Model):
    fubar = models.ForeignKey(Fubar)

如果我使用 .related_set 访问相关,我希望 ORM 会神奇地缓存父 Fubar 对象:

fubar = Fubar.objects.all()[0]
related = fubar.related_set.all()[0]
related.fubar

这会产生 3 个查询,而我希望它只会产生 2 个查询,因为在这种情况下,related.fubar 可以优化为我在其上调用 RelatedManager 的同一个对象。

【问题讨论】:

标签: python django django-orm django-related-manager


【解决方案1】:

虽然我不确定为什么这不起作用(可能是魔法还原除外),但您可以轻松避免额外的查询

fubar.related_set.select_related('fubar')[0]

【讨论】:

  • 这确实有帮助,谢谢。我希望它是 fubar 的确切对象/状态,因为在当前实例中,我正在获取和缓存 fubar 对象上的其他信息。我只需要维护自己的对象缓存并使用 fubar_id 进行查找。
【解决方案2】:

在 django 1.4 中,他们引入了prefetch_related,它将自动在单个批次中检索每个指定查找的相关对象。

【讨论】:

    猜你喜欢
    • 2020-02-17
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2014-07-07
    • 1970-01-01
    相关资源
    最近更新 更多