При использовании django-фильтров с каркасом отдыха django, форма фильтрации запросов по умолчанию добавит все параметры запроса для всех полей, и пустые поля в конечном итоге станут пустыми строками, переданными в бэкэнд.Пустые строки не являются None, поэтому status = self.request.query_params.get('status', None)
все равно добавит пустую строку в переменную, и это попадет в функцию queryset.filter.Это очень плохо, когда фильтруемое поле не является строкой.
Итак, мой вопрос, я что-то не так делаю?Есть ли способ проверить наличие пустых строковых параметров?Я не уверен, правильно ли я делаю фильтрацию (возможно, я фильтрую дважды без причины, но мне нужны там фильтры django из-за встроенной интеграции с API просмотра django-rest-frameworks.
Мой обходной путь - троичный оператор, проверяющий пустую строку после вызова query_params.get
Ниже приведен мой код представления для API:
class JobList(generics.ListCreateAPIView):
serializer_class = JobCreateSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
filter_backends = (filters.OrderingFilter, DjangoFilterBackend)
filterset_fields = ('status', 'success', 'worker_id', 'owner', 'job_type')
ordering_fields = ('priority', 'submitted', 'assigned', 'completed')
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
def get(self, request, format=None):
# IMPORTANT: use self.get_queryset() any place you want filtering to be enabled
# for built in filtering or ordering you must call self.filter_queryset
jobs = self.filter_queryset(self.get_queryset())
serializer = JobSerializer(jobs, context={'request': request}, many=True)
return Response(serializer.data)
def get_queryset(self):
"""
This view should return a list of all the purchases
for the currently authenticated user.
"""
queryset = Job.objects.all()
status = self.request.query_params.get('status', None)
status = status if not status == '' else None
success = self.request.query_params.get('success', None)
success = success if not success == '' else None
worker_id = self.request.query_params.get('worker_id', None)
worker_id = worker_id if not worker_id == '' else None
owner_id = self.request.query_params.get('owner', None)
owner_id = owner_id if not owner_id == '' else None
job_type = self.request.query_params.get('job_type', None)
job_type = job_type if not job_type == '' else None
if status is not None:
queryset = queryset.filter(status=status)
if success is not None:
queryset = queryset.filter(success=success)
if worker_id is not None:
queryset = queryset.filter(worker_id=worker_id)
if owner_id is not None:
queryset = queryset.filter(owner=owner_id)
if job_type is not None:
queryset = queryset.filter(job_type=job_type)
return queryset