django-filter icon indicating copy to clipboard operation
django-filter copied to clipboard

lookup to an unrecognized field type ArrayField

Open bobonthetop opened this issue 5 years ago • 2 comments

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

bobonthetop avatar Jun 04 '19 15:06 bobonthetop


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 avatar Jun 14 '19 04:06 charanjit-singh

@charanjit-singh did you manage to make this work with normal Django views, without DRF? I tried inheriting your PostgresFieldFilterSet but no luck.

ivasic avatar Jun 25 '19 13:06 ivasic