Search code examples
djangodjango-rest-frameworkdjango-filterdjango-filters

iexact doesn't work in declaring filterable field in django-filter


I am using django-filter lib with DRF.

class OrganizationFilter(FilterSet):

    class Meta:
        model = Organization
        fields = {
            'city': ['iexact', 'contains'],
            'zipcode': ['exact', 'contains']
        }

city: CharField

I want to filter city field case-insensitive.

I can make it work by specifying the following.

class OrganizationFilter(FilterSet):
    city = filters.CharFilter(lookup_expr='iexact')
    ...

Unless If I don't specify the lookup_expr it's not working.

I want to know why?


Solution

  • The reason why, is not working:

    fields = {
                'city': ['iexact', 'contains'],
                'zipcode': ['exact', 'contains']
            }
    

    Is because you specified 'contains' next to 'iexact'. Contains will perform a case-sensitive lookup which will be in conflict with you're iexact lookup. So you're code should look like:

    class OrganizationFilter(FilterSet):
        class Meta:
            model = Organization
            fields = {
                'city': ['iexact'],
                'zipcode': ['exact', 'contains']
            }