From 2d296f1561c20ab7c1d2d9c519e98fd36b33cbe2 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Sat, 14 Feb 2026 11:48:17 +0330 Subject: [PATCH] add PostgreSQL support and enhance product search functionality --- backend/core/settings/base.py | 1 + backend/product/migrations/0070_enable_pg_trgm.py | 12 ++++++++++++ backend/product/views.py | 14 +++++++++++--- 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 backend/product/migrations/0070_enable_pg_trgm.py diff --git a/backend/core/settings/base.py b/backend/core/settings/base.py index 8e49391..65ea872 100644 --- a/backend/core/settings/base.py +++ b/backend/core/settings/base.py @@ -54,6 +54,7 @@ INSTALLED_APPS = [ "django.contrib.messages", "django.contrib.staticfiles", "django.contrib.humanize", + "django.contrib.postgres", # Third-Party Apps "storages", "corsheaders", diff --git a/backend/product/migrations/0070_enable_pg_trgm.py b/backend/product/migrations/0070_enable_pg_trgm.py new file mode 100644 index 0000000..a09ab22 --- /dev/null +++ b/backend/product/migrations/0070_enable_pg_trgm.py @@ -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"), + ] diff --git a/backend/product/views.py b/backend/product/views.py index d00dfd9..9f24514 100644 --- a/backend/product/views.py +++ b/backend/product/views.py @@ -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')