Je pense qu'une bonne pratique ici serait de créer une étiquette de modèle pour ce travail. De cette façon, vous pouvez mettre en cache le modèle rendu et seulement frapper la base de données au premier rendu.
d'abord, créez la balise de modèle dans votre application
templatetags/show_categories_list.py
from django.core.cache import cache
@register.simple_tag
def show_categories_list():
cached = cache.get('CATEGORIES_LIST_CACHE_KEY', None)
if cached is None:
categories = Category.objects.all()
rendered = render_to_string('all_categories.html', {'categories': categories})
cache.set('CATEGORIES_LIST_CACHE_KEY', rendered)
return rendered
return cached
Ensuite, créez le modèle à utiliser
all_categories.html
{% for category in categories %}
<h1>{{ category.name }}</h1>
<ul>
{% for sub in category.subcategory_set.all %}
<li>{{ sub.name }}</li>
{% endfor %}
</ul>
{% endfor %}
Remplacez la méthode de sauvegarde dans vos modèles afin de supprimer catégories e liste entrée de cache (le forçant à rendre à la prochaine demande, cela pourrait aussi être placé à la (pré | post) signal _save):
models.py
class Category(models.Model):
name = models.CharField(max_length=50)
def save(self, *args, **kwargs):
cache.delete('CATEGORIES_LIST_CACHE_KEY')
return super(Category, self).save(*args, **kwargs)
class SubCatergory(models.Model):
parent_category = models.ForeignKey(Category)
name = models.CharField(max_length=100)
def save(self, *args, **kwargs):
cache.delete('CATEGORIES_LIST_CACHE_KEY')
return super(Category, self).save(*args, **kwargs)
Et enfin l'utiliser comme ceci:
base.html
{% load show_categories_list %}
{% show_categories_list %}
Vous pouvez également ajouter un délai d'attente à l'entrée du cache, de sorte que vous ne devez pas remplacer la méthode de sauvegarde dans vos modèles, mais vous devrez attendre le délai d'attente pour qu'il puisse être rendu à nouveau.
Quelques références utiles:
http://docs.djangoproject.com/en/1.2/howto/custom-template-tags/#shortcut-for-simple-tags http://docs.djangoproject.com/en/1.2/topics/cache/#the-low-level-cache-api http://docs.djangoproject.com/en/1.2/topics/signals/
Merci, il n'y a qu'une seule profondeur de sous-catégorie. –