Вы делаете это неправильно.Во-первых, позвольте мне посоветовать, что такую фильтрацию следует выполнять методом filter_queryset
, а не методом get_queryset
или лучше, используйте DjangoFilterBackend из django-filter , что является обычной практикой.
Теперь, касаясь вашего кода, вы добавляете фильтры, даже если они не указаны.Предполагая, что клиент добавил параметр запроса full_name=foo
, ваш код добавляет email="",facility_name="",user_state=""
к фильтру, который, скорее всего, не будет ничего возвращать, поскольку в базе данных не будет комбинации этих значений.Поэтому вместо того, чтобы делать это, добавьте только указанные параметры запроса.
Что-то вроде этого:
def get_queryset(self):
filter_fields = ['full_name', 'email', 'facility_name', 'user_state']
params = {'{}__icontains'.format(k): v for k,v in self.request.query_params.items() if k in filter_fields}
queryset = User.objects.filter(**params) \
.annotate(facility=F('facility_name'),
state=F('user_state'),
last_access=F('lastAccess')) \
.order_by('-id').distinct()
return queryset
Опять же, вам следует подумать о переносе этого в filter_queryset
, так как это означает методдля фильтрации.