Я думаю, что хорошей практикой здесь будет создание тега шаблона для этой работы. Таким образом, вы можете кэшировать визуализированный шаблон и попадать в базу данных только при первом рендере.
Сначала создайте тег шаблона внутри вашего приложения
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
Затем создайте шаблон для использования
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 %}
Переопределите метод сохранения в ваших моделях, чтобы он удалял запись кэша списка категорий (заставляя его отображаться при следующем запросе, его также можно поместить в сигнал (pre | post) _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)
И, наконец, используйте это так:
base.html
{% load show_categories_list %}
{% show_categories_list %}
Вы также можете добавить тайм-аут в запись кэша, чтобы вам не приходилось переопределять метод сохранения в ваших моделях, но вам придется подождать тайм-аут, чтобы его можно было снова отобразить.
Некоторые полезные ссылки:
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/