Фильтр не работает должным образом в Django REST Framework
Это мой 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 является CharField и department является ForeignKey в Test Model.
Когда я передаю этот url - http://127.0.0.1:8000/api/v1/package/test/?name=fun&department_id=7 Он игнорирует deparment_id. Я просто не знаю почему. По отдельности оба работают нормально. Мне интересно, почему он игнорирует deparment_id? Спасибо!!!
if-elif-else
будут введены только один раз, вам нужно разобрать их, вот так:
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()