Django一旦被访问就会缓存相关的ForeignKey和ManyToManyField字段吗?

时间:2011-11-29 19:19:18

标签: python django django-models

鉴于以下模型,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,但很高兴知道其他版本中有什么。

1 个答案:

答案 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方法会递归预先填充所有一对多关系的缓存。