2013-08-13 1 views
2

Следующая функция получает все категории и подкатегории, а затем передает их в шаблон. В основном, в топ-категории есть category id = 1 - поэтому мы получаем любые категории, которые имеют верхнюю категорию в качестве их родительской, и затем мы получаем их подкатегории. Проблема в том, что у нас есть ~ 90 запросов на основе этого кода. Мне интересно, может ли кто-нибудь предложить более эффективный способ предоставления этой информации и сокращения количества вызовов базы данных?Оптимизация запросов к базе данных в Django со статьями и подкатегориями

def all_models(request): 
    topcats = Category.objects.filter(parent=1).order_by('category') 
    subcats = {} 
    for each in topcats: 
     subcats [each] = [] 
     subcategories = Category.objects.filter (parent= each.id).order_by('category') 
     for subcat in subcategories: 
      subcats[each].append(subcat) 
    return render_to_response("parts/all.html", { 
     "topcats":topcats, 
     "subcats": subcats, 
    }, context_instance=RequestContext(request)) 
+0

Запросить для всех категорий, перебрать их и построить дерево категорий в коде. –

+0

Не могли бы вы разместить какой-то код - я что-то пробовал, но это не сработало. – user1328021

ответ

1
topcats = Category.objects.prefetch_related('category_set').filter(parent_id=1).order_by('category') 

Если вы указали related_name для parent в вашей модели, вы должны, конечно, заменить category_set с этим именем.

Это позволит получить все необходимые категории всего за два запроса. Возможно, вам захочется определить порядок на вашей модели, или вы не сможете заказать по category в своих подкатегориях. Затем в шаблоне вы можете:

{% for topcat in topcats %} 
    - {{ topcat.category }} 
    {% for subcat in topcat.category_set.all %} 
     -- {{ subcat.category }} 
    {% endfor %} 
{% endfor %} 
Смежные вопросы