Django - 使用相关模型字段的性能

时间:2013-05-30 23:25:58

标签: python django

假设我有两个相关模型

class Foo(models.Model):
    value = models.FloatField()

class Bar(models.Model):
    multiplier = models.FloatField()
    foo = models.ForeignKey(Foo, related_name="bars")

    def multiply(self):
        return self.foo.value * self.multiplier

Foo的一个实例经常会有很多Bar的实例,但是一些与Bar所做计算相关的信息存储在Foo中(因为它对所有相关Bars的实例都是相同的)

问题出在我做这样的事情时:

foo = Foo.objects.latest()
[x.multiply() for x in foo.bars.all()]

它最终会对数据库产生很大影响,因为foo.bars.all()中的每个Bar对象都会在数据库中查询Foo对象。所以,如果我有10个Bars,那么我将产生11个数据库查询(1个用于获取10个条形的查询集,并且每个Bar对象返回1个以获得self.foo.value)。使用select_related()似乎没有帮助。

我的问题是:   1)我认为memcached(例如Johnny Cache,Cache Machine)能解决这个问题吗?   2)有没有一种设计对象关系的方法,可以在没有缓存的情况下提高命令的效率?

1 个答案:

答案 0 :(得分:3)

正是这种情况为select_relatedprefetch_related创建了。当您使用这些查询时,Django的ORM将采用两种技术之一来避免冗余数据库请求:通过JOIN(select_related)跟踪关系或在其QuerySet中预先缓存一对多/多对多关系

# Hits the database
foo = Foo.objects.prefetch_related('bars').latest()

# Doesn't hit the database
[x.value for x in foo.bars.all()]