spraj
spraj

Reputation: 65

Filter is not working properly in Django REST Framework

This is my TestViewSet.

class TestViewSet(ListAPIView, CreateAPIView, UpdateAPIView):
permission_classes = [
    IsAuthenticated,
]
pagination_class = CustomPagination
serializer_class = TestSerializer
model = Test
create_class = CreateTestSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['department__name', 'code', 'billing_category__id', 'billing_category__name']

def get_queryset(self):
    name_str = self.request.query_params.get("name")
    department_id = self.request.query_params.get("department_id")
    pk = self.kwargs.get("id")
    self.pagination_class.page_size = page_size
    if name_str is not None:
        return self.model.objects.filter(
            Q(name__icontains=name_str)
            | Q(name__iexact=name_str)
            | Q(name__istartswith = name_str)
            )
    elif pk is not None:
        return self.model.objects.filter(id=pk)
    elif department_id is not None:
        return self.model.objects.filter(department_id=department_id)
    else:
        return self.model.objects.all()

name is CharField and department is ForeignKey in Test Model.

When i am passing this url - http://127.0.0.1:8000/api/v1/package/test/?name=fun&department_id=7 It is ignoring deparment_id. I just don't know why. Individually both are working fine. I'm wondering why it is ignoring deparment_id ? Thank you !!

Upvotes: 0

Views: 167

Answers (1)

pppig
pppig

Reputation: 1275

if-elif-else will only be entered once, you need to take them apart, like this:

bool(Q()) is False

def get_queryset(self):
    name_str = self.request.query_params.get("name")
    department_id = self.request.query_params.get("department_id")
    pk = self.kwargs.get("id")
    self.pagination_class.page_size = page_size

    lookup = Q()
    if name_str is not None:
        lookup |= Q(name__icontains=name_str)
            | Q(name__iexact=name_str)
            | Q(name__istartswith = name_str)
    if department_id is not None:
        lookup &= Q(department_id=department_id)
        # lookup |= Q(department_id=department_id)

    if lookup:
        return self.model.objects.filter(lookup)
    elif pk is not None:
        return self.model.objects.filter(id=pk)
    else:
        return self.model.objects.all()

Upvotes: 1

Related Questions