optimze home page and product page

This commit is contained in:
Parsa Nazer
2026-05-06 10:27:08 +03:30
parent 74554a664a
commit c97570e541
7 changed files with 205 additions and 34 deletions
+76 -14
View File
@@ -1,11 +1,13 @@
from django.shortcuts import render, get_object_or_404, redirect
from rest_framework.views import APIView, Response
from product.models import ProductModel, SubCategoryModel, MainCategoryModel
from product.models import ProductModel, SubCategoryModel, MainCategoryModel, ProductVariant
from product.serializers import SubCategorySerializer, DynamicProductSerializer, MainCategorySerializer
from .serializers import *
from .models import *
from rest_framework import status
from django.views import View
from django.db.models import Prefetch
from django.core.cache import cache
class ChangeViewVideo(View):
@@ -18,31 +20,87 @@ class ChangeViewVideo(View):
class HomeView(APIView):
authentication_classes = []
def get(self, request):
# Check cache first for anonymous users
cache_key = 'home_view_data_anonymous'
if not request.user.is_authenticated:
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data, status=status.HTTP_200_OK)
sliders = SliderModel.objects.all()
sliders = SliderModel.objects.only('id', 'link', 'title', 'description', 'image', 'video')[:10]
slider_ser = SliderSerializer(instance=sliders, many=True, context={'request': request})
main_categories = MainCategoryModel.objects.filter(show_in_home=True)
main_categories = MainCategoryModel.objects.filter(
show_in_home=True
).prefetch_related('subcategorys')
main_category_ser = MainCategorySerializer(instance=main_categories, many=True, context={'request': request})
top_seller_products = ProductModel.objects.filter(show_in_top_seller=True)
top_seller_products_ser = DynamicProductSerializer(instance=top_seller_products, many=True, context={'request': request, 'view_type': 'list'})
# Optimize variant prefetching - prefetch all variants, limit applied in serializer
variant_prefetch = Prefetch(
'variants',
ProductVariant.objects.prefetch_related('images').order_by('-discount', 'price')
)
lot_of_discount_products = ProductModel.objects.filter(show_in_lot_of_discount=True)
lot_of_discount_products_ser = DynamicProductSerializer(instance=lot_of_discount_products, many=True, context={'request': request, 'view_type': 'list'})
# Top seller products
top_seller_products = ProductModel.objects.filter(
show_in_top_seller=True
).select_related('category', 'shop').prefetch_related(
variant_prefetch
).only('id', 'name', 'image', 'rating', 'slug', 'category', 'shop')[:20]
top_seller_products_ser = DynamicProductSerializer(
instance=top_seller_products,
many=True,
context={'request': request, 'view_type': 'list'}
)
most_viewed_products = ProductModel.objects.filter(show_in_most_viewed=True)
most_viewed_products_ser = DynamicProductSerializer(instance=most_viewed_products, many=True, context={'request': request, 'view_type': 'list'})
# Lot of discount products
lot_of_discount_products = ProductModel.objects.filter(
show_in_lot_of_discount=True
).select_related('category', 'shop').prefetch_related(
variant_prefetch
).only('id', 'name', 'image', 'rating', 'slug', 'category', 'shop')[:20]
lot_of_discount_products_ser = DynamicProductSerializer(
instance=lot_of_discount_products,
many=True,
context={'request': request, 'view_type': 'list'}
)
trends_products = ProductModel.objects.filter(show_in_trends=True)
trends_products_ser = DynamicProductSerializer(instance=trends_products, many=True, context={'request': request, 'view_type': 'list'})
# Most viewed products
most_viewed_products = ProductModel.objects.filter(
show_in_most_viewed=True
).select_related('category', 'shop').prefetch_related(
variant_prefetch
).only('id', 'name', 'image', 'rating', 'slug', 'category', 'shop')[:20]
most_viewed_products_ser = DynamicProductSerializer(
instance=most_viewed_products,
many=True,
context={'request': request, 'view_type': 'list'}
)
home_image = HomeImageModel.objects.all().first()
# Trends products
trends_products = ProductModel.objects.filter(
show_in_trends=True
).select_related('category', 'shop').prefetch_related(
variant_prefetch
).only('id', 'name', 'image', 'rating', 'slug', 'category', 'shop')[:20]
trends_products_ser = DynamicProductSerializer(
instance=trends_products,
many=True,
context={'request': request, 'view_type': 'list'}
)
home_image = HomeImageModel.objects.only(
'id', 'image1', 'image2', 'title1', 'title2',
'description1', 'description2', 'link1', 'link2',
'video1', 'video2'
).first()
home_image_ser = HomeImageSerializer(instance=home_image, context={'request': request})
show_cases = ShowCaseSlider.objects.all()
show_cases = ShowCaseSlider.objects.only(
'id', 'title', 'description', 'image1', 'image2', 'image3', 'background_image'
)[:10]
show_cases_ser = ShowCaseSliderSerialzier(instance=show_cases, many=True, context={'request': request})
response = {
@@ -57,4 +115,8 @@ class HomeView(APIView):
'show_case_slider': show_cases_ser.data
}
# Cache for anonymous users only (avoid issues with user-specific data)
if not request.user.is_authenticated:
cache.set(cache_key, response, 60 * 5) # 5 minutes cache
return Response(response, status=status.HTTP_200_OK)