2011-11-29 12 views
8

Dado el siguiente modelo, ¿Django guarda en caché los objetos relacionados después de la primera vez que se accede?¿Django guarda en caché los campos ForeignKey y ManyToManyField una vez que se accede a ellos?

class Post(models.Model): 
    authors = models.ManyToManyField(User) 
    category = models.ForeignKey(Category) 

Por ejemplo:

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 

Nota: Actualmente se trabaja con Django 1.3, pero es bueno saber lo que está disponible en otras versiones.

Respuesta

5

En el primer ejemplo the second query is cached. En el segundo caso (creo) que ambos causarán un DB golpeó a menos que utilice select_related en la consulta original:

post = Post.objects.select_related('category').get(id=1) 

EDITAR

estoy equivocado acerca de la segundo ejemplo. Si usa select_related en la consulta original, no volverá a acceder a la base de datos (ForeignKey se almacena en caché inmediatamente). Si no usa select_related, presionará DB en la primera consulta, pero la segunda consulta se almacenará en caché.

Desde:

https://docs.djangoproject.com/en/dev/topics/db/queries/#one-to-many-relationships

de Acceso Directo a uno-a-muchas relaciones se almacena en caché la primera vez que se accede al objeto relacionado. Los accesos posteriores a la clave externa en la misma instancia de objeto se almacenan en caché.

Tenga en cuenta que el método select_related() QuerySet acumula de forma recursiva la memoria caché de todas las relaciones uno a varios antes de tiempo.

+2

Todavía no del todo bien. Las consultas ManyToMany no se almacenan en caché en absoluto; en realidad, son equivalentes a las búsquedas inversas de FK, por lo que no se almacenan en caché, excepto cuando se utiliza la nueva funcionalidad 'prefetch_related' en 1.4. –

+0

Gracias. Administraré el almacenamiento en caché en los campos de ManyToMany cuando sea necesario. – bpscott

+0

La respuesta debe ser reparada y mejor aún probada. No veo el almacenamiento en caché en ninguno de los casos en DJ 1.5. – Bryce

Cuestiones relacionadas