Django rest framework пользовательский поиск

У меня есть набор представлений drf вот такого вида


class EntryViewSets(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    queryset = Entries.objects.all()
    serializer_class = EntrySerializer
    authentication_classes = (SessionAuthentication, BasicAuthentication)
    search_fields= ('desc',)
    filter_backends = (CustomSearchFilter,)

Здесь я хочу выполнить поиск по полю desc, которое имеет тип models.TextField. Поиск работает, но я хочу добавить некоторое условие к поиску. Я хочу, чтобы поиск совпадал с запросом, но только если совпадение не содержит #.

Например, допустим, у меня есть две записи с desc, test new и test #new.
. Теперь, если я сделаю запрос ?search=test, он вернет обе записи, и ?search=new также вернет обе. Но я хочу, чтобы второй запрос возвращал только первую запись, т.е. test new, а не test #new, поскольку она начинается с # и должна быть отброшена. Как мне это сделать?

Вы можете переопределить метод filter_queryset из CustomSearchFilter и фильтровать записи, в которых поле desc соответствует шаблону текста со словами, начинающимися с #.

def filter_queryset(self, request, queryset, view):
    qs = super().filter_queryset(request, queryset, view)
    qs = qs.exclude(desc__regex=r'#\b')
    return qs
Вернуться на верх