为什么Django的RelatedManager不在目标对象上缓存调用查找的对象?
如果我有以下这些模型:
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]