add PostgreSQL support and enhance product search functionality
This commit is contained in:
@@ -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 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')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user