filters
This commit is contained in:
parent
c7da37e7e7
commit
7ab6276397
@ -1,18 +1,26 @@
|
|||||||
import django_filters
|
import django_filters
|
||||||
|
from django.conf import settings
|
||||||
from django.contrib.postgres.search import TrigramSimilarity
|
from django.contrib.postgres.search import TrigramSimilarity
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from cookbook.forms import MultiSelectWidget
|
|
||||||
from cookbook.models import Recipe, Keyword, Food, ShoppingList
|
|
||||||
from django.conf import settings
|
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
|
|
||||||
|
from cookbook.forms import MultiSelectWidget
|
||||||
|
from cookbook.models import Food, Keyword, Recipe, ShoppingList
|
||||||
|
|
||||||
|
|
||||||
class RecipeFilter(django_filters.FilterSet):
|
class RecipeFilter(django_filters.FilterSet):
|
||||||
name = django_filters.CharFilter(method='filter_name')
|
name = django_filters.CharFilter(method='filter_name')
|
||||||
keywords = django_filters.ModelMultipleChoiceFilter(queryset=Keyword.objects.all(), widget=MultiSelectWidget,
|
keywords = django_filters.ModelMultipleChoiceFilter(
|
||||||
method='filter_keywords')
|
queryset=Keyword.objects.all(),
|
||||||
foods = django_filters.ModelMultipleChoiceFilter(queryset=Food.objects.all(), widget=MultiSelectWidget,
|
widget=MultiSelectWidget,
|
||||||
method='filter_foods', label=_('Ingredients'))
|
method='filter_keywords'
|
||||||
|
)
|
||||||
|
foods = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
queryset=Food.objects.all(),
|
||||||
|
widget=MultiSelectWidget,
|
||||||
|
method='filter_foods',
|
||||||
|
label=_('Ingredients')
|
||||||
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def filter_keywords(queryset, name, value):
|
def filter_keywords(queryset, name, value):
|
||||||
@ -27,16 +35,20 @@ class RecipeFilter(django_filters.FilterSet):
|
|||||||
if not name == 'foods':
|
if not name == 'foods':
|
||||||
return queryset
|
return queryset
|
||||||
for x in value:
|
for x in value:
|
||||||
queryset = queryset.filter(steps__ingredients__food__name=x).distinct()
|
queryset = queryset.filter(
|
||||||
|
steps__ingredients__food__name=x
|
||||||
|
).distinct()
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def filter_name(queryset, name, value):
|
def filter_name(queryset, name, value):
|
||||||
if not name == 'name':
|
if not name == 'name':
|
||||||
return queryset
|
return queryset
|
||||||
if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2':
|
if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2': # noqa: E501
|
||||||
queryset = queryset.annotate(similarity=TrigramSimilarity('name', value), ).filter(
|
queryset = queryset \
|
||||||
Q(similarity__gt=0.1) | Q(name__icontains=value)).order_by('-similarity')
|
.annotate(similarity=TrigramSimilarity('name', value), ) \
|
||||||
|
.filter(Q(similarity__gt=0.1) | Q(name__icontains=value)) \
|
||||||
|
.order_by('-similarity')
|
||||||
else:
|
else:
|
||||||
queryset = queryset.filter(name__icontains=value)
|
queryset = queryset.filter(name__icontains=value)
|
||||||
return queryset
|
return queryset
|
||||||
|
Loading…
Reference in New Issue
Block a user