django-filter
django-filter copied to clipboard
lookup to an unrecognized field type ArrayField
Hello, I am trying to use django-filter on my project and one of my model has an ArrayField as a field (from django.contrib.postgres.fields). I tried filter_overrides but I still have the same error. What am I missing ? Also, I don't want to do any filter on this field and tried to use exclude, but I keep having the same error.
Env:
Python 3.7.1 Django (2.1.3) django-filter (2.1.0)
Code:
import django_filters
from django.contrib.postgres.fields import ArrayField
class my_filter(django_filters.FilterSet):
field_1 = django_filters.CharFilter(lookup_expr='iexact')
field_2 = django_filters.CharFilter(lookup_expr='iexact')
class Meta:
model = my_model
fields = ['field_1', 'field_2']
filter_overrides = {
ArrayField: {
'filter_class': django_filters.CharFilter,
'extra': lambda f: {
'lookup_expr': 'icontains',
'lookup_expr': 'iexact',
'lookup_expr': 'exact',
},
}
}
Thanks
from django.contrib.postgres.fields import ArrayField
from django.contrib.postgres.forms import SimpleArrayField
from django_filters import filterset
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from django_filters.rest_framework.filters import Filter
class ArrayFilter(Filter):
"""
Array filter to tell filterset about base field class for lookups.
"""
base_field_class = SimpleArrayField
class PostgresFieldFilterSet(filters.FilterSet):
"""
As per the code, default filters are placed in FILTER_DEFAULTS.
This code is updating the FILTER_DEFAULTS and appending Custom Fields (ArrayField)
for consideration.
"""
FILTER_DEFAULTS = deepcopy(filterset.FILTER_FOR_DBFIELD_DEFAULTS)
FILTER_DEFAULTS.update({
ArrayField: {
'filter_class': ArrayFilter
},
})
class FilterBackend(DjangoFilterBackend):
"""
FilterBackend with PostgresFieldFilterSet as the default filter_set.
"""
default_filter_set = PostgresFieldFilterSet
This should work. lookup_fields = POSTGRESQL_FIELDS LOOKUPS P.S. You may have to handle the exceptions and please ping me if you find any.
@charanjit-singh did you manage to make this work with normal Django views, without DRF? I tried inheriting your PostgresFieldFilterSet
but no luck.