add PostgreSQL support and enhance product search functionality

This commit is contained in:
Parsa Nazer
2026-02-14 11:48:17 +03:30
parent 0414335181
commit 2d296f1561
3 changed files with 24 additions and 3 deletions
+1
View File
@@ -54,6 +54,7 @@ INSTALLED_APPS = [
"django.contrib.messages",
"django.contrib.staticfiles",
"django.contrib.humanize",
"django.contrib.postgres",
# Third-Party Apps
"storages",
"corsheaders",
@@ -0,0 +1,12 @@
from django.db import migrations
from django.contrib.postgres.operations import CreateExtension
class Migration(migrations.Migration):
dependencies = [
("product", "0069_alter_productvariant_currency"),
]
operations = [
CreateExtension("pg_trgm"),
]
+11 -3
View File
@@ -6,7 +6,9 @@ from .models import *
from .serializers import *
from rest_framework import status
from rest_framework.response import Response
from django.db.models import Q
from django.db.models import Q, Value
from django.db.models.functions import Coalesce
from django.contrib.postgres.search import TrigramSimilarity
from django.shortcuts import get_object_or_404
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from utils.pagination import StructurePagination
@@ -286,8 +288,12 @@ class AllProductsView(APIView):
# Search filter
search_query = request.query_params.get('search')
if search_query:
products = products.filter(Q(name__icontains=search_query) | Q(
description__icontains=search_query))
products = products.annotate(
similarity=(
TrigramSimilarity('name', search_query)
+ TrigramSimilarity(Coalesce('description', Value('')), search_query)
)
).filter(similarity__gt=0.1)
# Price filters
price_gte = request.query_params.get('price_gte')
@@ -314,6 +320,8 @@ class AllProductsView(APIView):
sort_by = request.query_params.get('sort')
if sort_by in ['name', '-name', 'created_at', '-created_at']:
products = products.order_by(sort_by)
elif search_query:
products = products.order_by('-similarity', 'name')
else:
products = products.order_by('name')