Пользовательская функция 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()
Вернуться на верх