Django: имя 'filter_name__icontains' не определено
Я работаю над пользовательским фильтром в моем приложении Django (DRF).
Базовая фильтрация (iexact) работает:
queryset = queryset.filter(**{filter_name: term.get(filter_name)}) # OK
Но я хочу фильтровать поля CharFields с помощью логики icontains:
queryset = queryset.filter(**{filter_name__icontains: term.get(filter_name)}) # ERROR
Текст ошибки
NameError: имя 'filter_name__icontains' не определено
Вопрос: как я могу поддержать фильтрацию иконок в моей функции?
Мой код
from django.db.models import QuerySet, CharField
from rest_framework.filters import BaseFilterBackend
from rest_framework.request import Request
class AbstractFilterBackend(BaseFilterBackend):
@staticmethod
def __execute_default_filters(queryset, terms: list):
for term in terms:
filter_name = next(iter(term.keys()))
if hasattr(queryset.model, filter_name):
if queryset.model._meta.get_field(filter_name).__class__ is CharField:
queryset = queryset.filter(**{filter_name__icontains: term.get(filter_name)})
else:
queryset = queryset.filter(**{filter_name: term.get(filter_name)})
return queryset
В то время как filter_name
является переменной, вы не определили filter_name__icontains
. Для этого можно использовать форматирование строки:
queryset = queryset.filter(**{f'{filter_name}__icontains': term.get(filter_name)})