为什么Django的RelatedManager不在目标对象上缓存调用查找的对象?

6 投票
2 回答
1094 浏览
提问于 2025-04-17 12:01

如果我有以下这些模型:

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

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

我本来希望,当我通过.related_set访问Related的时候,ORM(对象关系映射)能自动缓存父级的Fubar对象:

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

但是这样会导致发出3个查询,而我原本希望只发出2个查询,因为在这个情况下,related.fubar可以优化成我在RelatedManager上调用的同一个对象。

2 个回答

0

在Django 1.4版本中,他们引入了一个叫做 prefetch_related 的功能。这个功能可以一次性自动获取与指定查询相关的对象,省去了多次查询的麻烦。

2

虽然我不太确定为什么这个不管用(可能是因为某种神奇的原因),但你可以很简单地避免多余的查询,使用下面的代码:

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

撰写回答