Пользовательская функция Django долго выполняется для представления
У меня есть функция ниже, которая генерирует навигацию, чтобы ее можно было использовать в представлении. Она подтягивает статьи, категорию статей и подкатегорию статей. Основная проблема заключается в том, что при наличии около 15 категорий, 46 подкатегорий и 33 статей загрузка этой функции занимает около 7-10 секунд. Как лучше поступить, чтобы функция загружалась быстрее?
def generate_navigation_list(request):
articles = Article.objects.all()
article_category = ArticleCategory.objects.all()
articles_sub_category = ArticleSubCategory.objects.all()
# Create a navigation list structure
navigation_list = []
# Iterate over categories
for category in article_category:
category_dict = {
'id': category.id,
'title': category.name,
'subcategory': []
}
# Filter subcategories for the current category
filtered_subcategories = articles_sub_category.filter(category=category)
# Iterate over filtered subcategories
for subcategory in filtered_subcategories:
subcategory_dict = {
'id': subcategory.id,
'title': subcategory.name,
'articles': []
}
# Filter articles for the current subcategory
filtered_articles = articles.filter(sub_category=subcategory).order_by('order')
# Add articles to the subcategory dictionary if there are articles
if filtered_articles.exists(): # Check if there are any articles
for article in filtered_articles:
article_dict = {
'title': article.title,
'slug': article.slug
}
subcategory_dict['articles'].append(article_dict)
# Append subcategory dictionary to category dictionary
category_dict['subcategory'].append(subcategory_dict)
# Append category dictionary to navigation list if it has subcategories with articles
if category_dict['subcategory']:
navigation_list.append(category_dict)
request.session['navigation_list'] = navigation_list
request.session.save()
В коде, который вы написали, вы запрашиваете статьи для каждой категории и подкатегории. Это означает, что в базу данных отправляется несколько запросов. Вместо этого вы можете использовать select_related
и prefetch_related
, чтобы получить данные из базы данных с меньшим количеством запросов.
def generate_navigation_list(request):
articles = Article.objects.select_related('sub_category').all()
article_categories = ArticleCategory.objects.prefetch_related('subcategories').all()
navigation_list = []
for category in article_categories:
category_dict = {
'id': category.id,
'title': category.name,
'subcategory': []
}
# Iterate over subcategories
for subcategory in category.subcategories.all():
subcategory_dict = {
'id': subcategory.id,
'title': subcategory.name,
'articles': []
}
filtered_articles = [article for article in articles if article.sub_category == subcategory]
if filtered_articles:
for article in filtered_articles:
article_dict = {
'title': article.title,
'slug': article.slug
}
subcategory_dict['articles'].append(article_dict)
category_dict['subcategory'].append(subcategory_dict)
if category_dict['subcategory']:
navigation_list.append(category_dict)
request.session['navigation_list'] = navigation_list
request.session.save()