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