healer
healer

Reputation: 31

How to query a list django

def get_queryset(self):
    result = Tenants.objects.all()
    filters = self.request.GET.get('filter')

    if filters is not None:
        filters = filters[1] if filters[1] == ',' else filters
        filters_list = filters.split(',')
        filter_result = Tenants.objects.none()
        for value in filters_list:
            filter_result = filter_result | result.filter(Q(business_type__icontains=value)
            |Q(category__icontains=value))
        return filter_result
    
    return result.all()

here i want the query parameters to be business_type and category when using get method and checking the data i am only able to filter one field either business_type or category

when using filter twice like /?page=1&filter=business_type&filter=category then i am getting the data i want

but i need the data when the url is like /?page=1&filter=business_type,category

Upvotes: 1

Views: 216

Answers (2)

NKSM
NKSM

Reputation: 5884

Here can be used lookup in(Django Docs) filter business_type__in=filters.split(",").

def get_queryset(self):
    result = Tenants.objects.all()
    filters = self.request.GET.get('filter')

    if filters:
        filter_result = result.filter(business_type__in=filters.split(","))
        return filter_result
    
    return result

Upvotes: 1

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477607

You can query with:

def get_queryset(self):
    result = Tenants.objects.all()
    filters = self.request.GET.getlist('filter')
    if not filters:
        return Tenants.objects.all()
    Tenants.objects.filter(
        Q(*[
            Q(business_type__icontains=value) | Q(category__icontains=value)
            for filter in filters
            for value in filter.split(',') if value
        ],
        _connector=Q.OR
        )
    )

Upvotes: 1

Related Questions