add PostgreSQL support and enhance product search functionality
This commit is contained in:
@@ -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