diff --git a/README.md b/README.md index bcceed1..7c2ba1d 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ By default a `LimitOffsetPagination` pagination is enabled Examples: `http://127.0.0.1:8000/api/v1/products/?limit=10&offset=0` -The response data has the following keyspayload: +The response data has the following keys: ``` dict_keys(['count', 'next', 'previous', 'results']) ``` @@ -294,4 +294,6 @@ To create a dataset of fake companies and products: `python manage.py addtestdata` -Creates 10 Companies, with 100 products each. +Creates 10 Companies, with 10 products each. + +WARNING: the script deletes existing instances of both Company and Product diff --git a/back_latienda/settings/base.py b/back_latienda/settings/base.py index afc4c78..ccb5e4b 100644 --- a/back_latienda/settings/base.py +++ b/back_latienda/settings/base.py @@ -42,6 +42,7 @@ INSTALLED_APPS = [ 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.gis', + 'django.contrib.postgres', # 3rd party 'rest_framework', diff --git a/core/management/commands/addtestdata.py b/core/management/commands/addtestdata.py index 7d98462..35d7bf9 100644 --- a/core/management/commands/addtestdata.py +++ b/core/management/commands/addtestdata.py @@ -70,7 +70,10 @@ class Command(BaseCommand): # TODO: apply automatic tags from tag list # TODO: write image to S3 storage # create instance - product = ProductFactory(name=name, description=description) + product = ProductFactory( + company=company, + name=name, + description=description) # get image response = requests.get(self.logo_url, stream=True) diff --git a/products/tests.py b/products/tests.py index a71db66..a8a5e5e 100644 --- a/products/tests.py +++ b/products/tests.py @@ -477,6 +477,9 @@ class ProductSearchTest(TestCase): url = f"{self.endpoint}?query_string={query_string}" # send in request response = self.client.get(url) + + import ipdb; ipdb.set_trace() + payload = response.json() # check response self.assertEqual(response.status_code, 200) diff --git a/products/utils.py b/products/utils.py index a3bef8a..b5505d5 100644 --- a/products/utils.py +++ b/products/utils.py @@ -1,6 +1,7 @@ import logging from django.db.models import Q +from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector from products.models import Product @@ -72,3 +73,15 @@ def find_related_products(keyword): Q(attributes__in=attributes) ) return products_qs + + +def search_by_phrase(phrase): + SearchQuery(phrase, search_type='phrase') + pass + + +def alt_find_related_products(keyword, fields=('tags', 'attributes', 'category')): + vector = SearchVector(*fields) + products_qs = Product.objects.annotate(search=vector).filter(search=keyword) + return products_qs + diff --git a/products/views.py b/products/views.py index 685e748..47d8e4c 100644 --- a/products/views.py +++ b/products/views.py @@ -23,7 +23,7 @@ from companies.models import Company from history.models import HistorySync from back_latienda.permissions import IsCreator -from .utils import extract_search_filters, find_related_products +from .utils import extract_search_filters, find_related_products, alt_find_related_products from utils.tag_serializers import TaggitSerializer from utils.tag_filters import ProductTagFilter @@ -155,7 +155,8 @@ def product_search(request): chunks = query_string.split(' ') for chunk in chunks: - products_qs = find_related_products(chunk) + # products_qs = find_related_products(chunk) + products_qs = alt_find_related_products(chunk) for instance in products_qs: result_set.add(instance)