2011-11-29 91 views
8

鑑於以下模型,Django在第一次訪問它們之後緩存相關對象嗎?Django在訪問後是否緩存相關的ForeignKey和ManyToManyField字段?

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的工作,但它的好,知道什麼是在其他版本。

回答

5

在第一個示例the second query is cached中。 在第二種情況下(我相信),他們都將導致DB打,除非你在原來的查詢中使用 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方法提前預先填充所有一對多關係的緩存。

+2

還是不太對。 ManyToMany查詢根本沒有被緩存 - 它們實際上等同於反向FK查找,所以不要緩存,除非在1.4中使用新的'prefetch_related'功能。 –

+0

謝謝。必要時我會自己處理ManyToMany字段上的緩存。 – bpscott

+0

答案需要修復並且更好,然後進行測試。在DJ1.5中我沒有看到任何一種情況下的緩存。 – Bryce