鉴于以下模型,Django会在第一次访问相关对象后对其进行缓存吗?
class Post(models.Model):
authors = models.ManyToManyField(User)
category = models.ForeignKey(Category)
例如:
post = Post.objects.get(id=1)
# as i understand this hits the database
authors1 = post.authors.all()
# does this his the database again?
authors2 = post.authors.all()
# as i understand this hits the database
category1 = post.category
# does this hit the database again?
category2 = post.category
注意:目前正在使用Django 1.3,但很高兴知道其他版本中有什么。
答案 0 :(得分:6)
在第一个例子中the second query is cached。 在第二种情况下(我相信),除非您在原始查询中使用 select_related
,否则它们都会导致数据库命中:
post = Post.objects.select_related('category').get(id=1)
击> <击> 撞击>
修改强>
我对第二个例子错了。如果在原始查询中使用select_related
,则不会再次访问数据库(ForeignKey会立即缓存)。如果您不使用select_related
,您将在第一个查询中点击数据库,但第二个查询将被缓存。
自:
https://docs.djangoproject.com/en/dev/topics/db/queries/#one-to-many-relationships
第一次访问相关对象时,将缓存对一对多关系的转发访问。对高速缓存在同一对象实例上的外键的后续访问。
请注意,select_related()QuerySet方法会递归预先填充所有一对多关系的缓存。