от
Я написал функцию, вид на поиск и фильтрация данных в Django на основе определенных параметров. В полей категории и расположения пользователь может выбрать несколько параметров для поиска. Моя функция представлений состоит в следующем:
def search(request):

    queryset_list = Influencer.objects.order_by('

Функция поиска должна возвращать данные всех категорий и местоположения, для которых поиск производится. Например, если поиск производится на месте в Дели и Мумбае, тогда он должен вернуть всех специалистов, которые их расположение, как Дели или Мумбаи, то же касается и категорий.

Функция поиска работает для одного значения, но не работает для нескольких значений. Для Эл.G если Дели послать в категории расположении, то он возвращает правильные результаты, но если Дели, Мумбаи установлен, то он считывает только первое значение я.е Дели и относится соответственно фильтр.

Как мне изменить запрос так, что он работает правильно?

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

3 Ответы

0 голосов
от
Я думаю, самый простой подход будет такой Через вопрос
 from django.db.models import Q
    q = request.GET.get('q')
    if q:
    queryset_list = queryset_list.filter(Q(username__icontains=q)|Q(full_name__icontains=q)|
    Q(location_city__icontains=q)|Q(categories__name__iexact=q))
    return render(....
    else:
        messages.info(request,'no results found for {}',format(q))
И в шаблоне use
name=q
в форме поиска.
0 голосов
от
Вы пробовали с помощью Django-filterset для этой цели?
class InfluencerFilter(filters.FilterSet):
username = filters.CharFilter(name='username', lookup_expr='iexact')
fullname = filters.CharFilter(name='fullname', lookup_expr='iexact')
location = filters.NumberFilter(name='location', lookup_expr='exact')
categories = filters.CharFilter(name='categories', lookup_expr='exact')


class Meta:
    model = Influencer
    fields = ['username','fullname','location','categories']
И затем на ваш взгляд вы можете назвать этот фильтр, используя:
filter_backends = (filters.DjangoFilterBackend,)
filter_class = InfluencerFilter
Это избавит вас от всех утомительных и избыточные операторы if и будет работать только для параметров запроса, которые доступны и игнорировать все остальное.
0 голосов
от
Это, как мне сделать поиск на мои счета: возможные варианты поиска критерии с произвольным текстом (search_value), выберите группу, выберите поле (sel_group), флажок только активные (chk_active)
    def post(self, request, *args, **kwargs):
        search_value = request.POST.get('searchValue', None)
        sel_group = request.POST.get('selGroup', 'ALL')
        chk_active = request.POST.get('chkActive', 0)

        filters = Q()
        if chk_active == '1':
            filters = filters
...