假设我有两个相关模型
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)有没有一种设计对象关系的方法,可以在没有缓存的情况下提高命令的效率?
答案 0 :(得分:3)
正是这种情况为select_related
和prefetch_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()]