Как игнорировать специальные символы в поле поиска в 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)
Вернуться на верх