testing similarity

This commit is contained in:
vabene1111 2019-12-08 17:42:12 +01:00
parent 9446f97ede
commit a4f715997e

View File

@ -1,11 +1,12 @@
import django_filters import django_filters
from django.contrib.postgres.search import TrigramSimilarity
from django.db.models import Q
from cookbook.forms import MultiSelectWidget from cookbook.forms import MultiSelectWidget
from cookbook.models import Recipe, Keyword from cookbook.models import Recipe, Keyword
class RecipeFilter(django_filters.FilterSet): class RecipeFilter(django_filters.FilterSet):
name = django_filters.CharFilter(lookup_expr='icontains') name = django_filters.CharFilter(method='filter_name')
keywords = django_filters.ModelMultipleChoiceFilter(queryset=Keyword.objects.all(), widget=MultiSelectWidget, keywords = django_filters.ModelMultipleChoiceFilter(queryset=Keyword.objects.all(), widget=MultiSelectWidget,
method='filter_keywords') method='filter_keywords')
@ -17,6 +18,14 @@ class RecipeFilter(django_filters.FilterSet):
queryset = queryset.filter(keywords=x) queryset = queryset.filter(keywords=x)
return queryset return queryset
@staticmethod
def filter_name(queryset, name, value):
if not name == 'name':
return queryset
queryset = Recipe.objects.annotate(similarity=TrigramSimilarity('name', value), ).filter(Q(similarity__gt=1) | Q(name__icontains=value)).order_by('-similarity')
return queryset
class Meta: class Meta:
model = Recipe model = Recipe
fields = ['name', 'keywords'] fields = ['name', 'keywords']