Как игнорировать специальные символы в поле поиска в Django
Модель выглядит примерно так
class Product(BaseModel):
name = models.CharField(db_column='name', max_length=200, blank=False, null=False, unique=True)
Вид является
class ProductViewSet(BaseViewSet):
queryset = Product.objects.all()
...
filterset_class = ProductFilter
Фильтр является
class ProductFilter(django_filters.FilterSet):
search = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
class Meta:
model = Product
fields = []
Теперь... если поле name имеет значение что-то вроде "This is a/sample", а текст поиска - "asample". Я хотел бы вернуть этот ряд.
Заранее спасибо.
Если вопрос касается только одного специального символа, т.е. '/', то вы можете создать пользовательский метод фильтрации с помощью Replace следующим образом :
class ProductFilter(django_filters.FilterSet):
def filter_without_special_chars(self, queryset, field, value):
return queryset.annotate(search_field=Replace('name', Value('/'), Value('')).filter(search_field=value)
search = django_filters.CharFilter(method='filter_without_special_chars')
class Meta:
model = Product
fields = []
Вы также можете сделать это для многочисленных специальных символов НО это не будет оптимальным решением, я бы предложил вам использовать ElasticSearch (или что-то подобное) для этого.
Для замены нескольких символов функция будет выглядеть следующим образом :
def filter_without_special_chars(self, queryset, field, value):
return queryset.annotate(sf1=Replace('name', Value('!'), Value('')),
sf2=Replace('sf1', Value('%'), Value(''))).filter(sf2=value)