add PostgreSQL support and enhance product search functionality
This commit is contained in:
@@ -54,6 +54,7 @@ INSTALLED_APPS = [
|
|||||||
"django.contrib.messages",
|
"django.contrib.messages",
|
||||||
"django.contrib.staticfiles",
|
"django.contrib.staticfiles",
|
||||||
"django.contrib.humanize",
|
"django.contrib.humanize",
|
||||||
|
"django.contrib.postgres",
|
||||||
# Third-Party Apps
|
# Third-Party Apps
|
||||||
"storages",
|
"storages",
|
||||||
"corsheaders",
|
"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"),
|
||||||
|
]
|
||||||
@@ -6,7 +6,9 @@ from .models import *
|
|||||||
from .serializers import *
|
from .serializers import *
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.response import Response
|
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 django.shortcuts import get_object_or_404
|
||||||
from rest_framework.permissions import IsAuthenticatedOrReadOnly
|
from rest_framework.permissions import IsAuthenticatedOrReadOnly
|
||||||
from utils.pagination import StructurePagination
|
from utils.pagination import StructurePagination
|
||||||
@@ -286,8 +288,12 @@ class AllProductsView(APIView):
|
|||||||
# Search filter
|
# Search filter
|
||||||
search_query = request.query_params.get('search')
|
search_query = request.query_params.get('search')
|
||||||
if search_query:
|
if search_query:
|
||||||
products = products.filter(Q(name__icontains=search_query) | Q(
|
products = products.annotate(
|
||||||
description__icontains=search_query))
|
similarity=(
|
||||||
|
TrigramSimilarity('name', search_query)
|
||||||
|
+ TrigramSimilarity(Coalesce('description', Value('')), search_query)
|
||||||
|
)
|
||||||
|
).filter(similarity__gt=0.1)
|
||||||
|
|
||||||
# Price filters
|
# Price filters
|
||||||
price_gte = request.query_params.get('price_gte')
|
price_gte = request.query_params.get('price_gte')
|
||||||
@@ -314,6 +320,8 @@ class AllProductsView(APIView):
|
|||||||
sort_by = request.query_params.get('sort')
|
sort_by = request.query_params.get('sort')
|
||||||
if sort_by in ['name', '-name', 'created_at', '-created_at']:
|
if sort_by in ['name', '-name', 'created_at', '-created_at']:
|
||||||
products = products.order_by(sort_by)
|
products = products.order_by(sort_by)
|
||||||
|
elif search_query:
|
||||||
|
products = products.order_by('-similarity', 'name')
|
||||||
else:
|
else:
|
||||||
products = products.order_by('name')
|
products = products.order_by('name')
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user