There are models

class ProgramCategory(GenericPage): name = models.CharField(max_length=128) name_alternate = models.CharField(max_length=128, null=True) cover_image = models.ImageField(null=True, upload_to='programs') description = models.TextField(null=True, blank=True) active = models.BooleanField(default=True) def __unicode__(self): return self.name def get_programs(self): return self.program_set.filter(active=True) def get_absolute_url(self): return reverse('our_programs', args=[self.slug]) class Meta: verbose_name = 'Program Category' verbose_name_plural = 'Program Categories' ordering = ['sort_order'] class Program(GenericPage): name = models.CharField(max_length=128) description = models.TextField(null=True, blank=True) cover_image = models.ImageField(null=True, upload_to='programs') cover_image_cropping = ImageRatioField('cover_image', '301x201', size_warning=True) gallery = models.ForeignKey(Gallery, null=True, blank=True) video_gallery = models.ForeignKey(VideoGallery, null=True, blank=True) categories = models.ManyToManyField(ProgramCategory) banner = models.ForeignKey(Banner, null=True, blank=True) promotion_banner_group = models.ForeignKey(PromotionBannerGroup, null=True, blank=True) active = models.BooleanField(default=True) def __unicode__(self): return self.name def save(self, *args, **kwargs): super(Program, self).save(*args, **kwargs) def get_promotion_banners(self): if self.promotion_banner_group: return self.promotion_banner_group.get_banners() def get_absolute_url(self): return reverse('program', args=[self.categories.first().slug, self.slug]) def get_cover_image(self, category): return self.programcoverimage_set.filter(categories__slug=category).first() class Meta: ordering = ['sort_order'] 

In the context of the processor I have so

 def programs(request): return { 'programs_categories': ProgramCategory.objects.filter(active=True) } 

As in the context of the processor to optimize the query. If you disable it, only 11 requests go to the database, and with it 25 requests. Played with prefetch_related - nothing happened.

Here is the pattern where it is used.

 <div class="row h-programs"> {% for programs_category in programs_categories %} <div class="item-section"> <div class="item-section__title"><h3><a style="color: black" href="{{ programs_category.get_absolute_url }}">{{ programs_category.name }}</a></h3></div> <div class="item-section__image"><a href="{{ programs_category.get_absolute_url }}"><img src="{{ programs_category.cover_image|thumbnail_url:'program_thumbnail' }}" alt=""></a></div> <div class="item-section__description section">{{ programs_category.description|safe }}</div> <div class="item-section__button"><a class="item-section__button-link" href="{{ programs_category.get_absolute_url }}">View More</a></div> </div> {% endfor %} </div> 

And yet in such

 <li class="menu-container__item menu-container__item_dropdown {% if page.slug == 'our-programs' %}active{% endif %}"> <a href="{% url 'our_programs' %}">Programs</a> <ul class="submenu"> {% for category in programs_categories %} <li> <a href="{{ category.get_absolute_url }}">{{ category.name_alternate }}</a> <ul class="submenu_inner"> {% for program in category.get_programs %} <li><a href="{% url 'program' category.slug program.slug %}">{{ program.name }}</a></li> {% endfor %} </ul> </li> {% endfor %} </ul> </li> 
  • Without a template using programs_categories, it's hard to say - andreymal
  • In the ProgrammCategory class in the get_programs method, I wrote return self.program_set.filter (active = True) .select_related ('banner', 'gallery', 'promotion_banner_group', 'video_gallery'). Number of requests as it was left - Igor Lisenko
  • I do not see the use of programs_categories in this template - andreymal
  • Yes, yes, not that part of the template. Sorry - Igor Lisenko

0