From 0629b0b4d4940df9d8a6155591e434a8de068848 Mon Sep 17 00:00:00 2001 From: Mojtaba Date: Mon, 12 Jun 2023 16:20:06 +0330 Subject: [PATCH] fix: optimize advertisement and category queries. --- advertisement/models.py | 2 +- advertisement/views.py | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/advertisement/models.py b/advertisement/models.py index 3ffa893..4ecda65 100644 --- a/advertisement/models.py +++ b/advertisement/models.py @@ -58,7 +58,7 @@ def get_absolute_url(self): @classmethod def is_belong_user(cls, user, advertisement_pk): """To check this advertisement posted by this user or not""" - advertisement = cls.objects.get(pk=advertisement_pk) + advertisement = cls.objects.select_related('user').get(pk=advertisement_pk) return user == advertisement.user diff --git a/advertisement/views.py b/advertisement/views.py index 9ed4dde..d70adb1 100644 --- a/advertisement/views.py +++ b/advertisement/views.py @@ -1,3 +1,4 @@ +from django.db.models import Prefetch from django.shortcuts import render from django.utils.decorators import method_decorator from django.views import View @@ -5,7 +6,7 @@ from django.views.generic import FormView, DetailView from advertisement.forms import PostAdvertisementForm -from advertisement.models import Advertisement +from advertisement.models import Advertisement, AdvertisementImage from category.models import Category from package.models import Package from .filters import AdvertisementFilter @@ -33,7 +34,8 @@ class AdvertisementDetailView(DetailView): template_name = 'advertisement/advertisement_detail.html' def get(self, request, *args, **kwargs): - advertisement = Advertisement.objects.get(pk=kwargs['pk']) + advertisement = Advertisement.objects.select_related('user', 'location__city', 'category').prefetch_related( + 'images').get(pk=kwargs['pk']) packages = Package.objects.filter(is_enable=True) return render(request, self.template_name, context={'advertisement': advertisement, 'packages': packages}) @@ -43,9 +45,10 @@ class AdvertisementCityListView(View): def get(self, request, *args, **kwargs): city = self.kwargs.get('city') - queryset = Advertisement.objects.filter(location__city__slug=city) + queryset = Advertisement.objects.filter(location__city__slug=city).prefetch_related( + Prefetch('images', queryset=AdvertisementImage.objects.order_by('id'))) filter = AdvertisementFilter(self.request.GET, queryset=queryset) - categories = Category.objects.all() + categories = Category.objects.all().select_related('parent').prefetch_related('children') response = render( request, 'advertisement/advertisement_list.html', context={'filter': filter, 'categories': categories, 'city': city} @@ -63,8 +66,9 @@ class AdvertisementCityCategoryListView(View): def get(self, request, *args, **kwargs): city = self.kwargs.get('city') category = self.kwargs.get('category') - queryset = Advertisement.objects.filter(location__city__slug=city, category__slug=category) - categories = Category.objects.all() + queryset = Advertisement.objects.filter(location__city__slug=city, category__slug=category).prefetch_related( + Prefetch('images', queryset=AdvertisementImage.objects.order_by('id'))) + categories = Category.objects.all().select_related('parent').prefetch_related('children') filter = AdvertisementFilter(self.request.GET, queryset=queryset) return render( request, 'advertisement/advertisement_list.html',