Search code examples
pythondjangodjango-filter

With django-filter, is there a quick way to support all possible lookups for fields?


django-filter allows you to easily declare filterable fields of a model.

For example,

class UserFilter(django_filters.FilterSet):
    class Meta:
        model = User
        fields = ['username']

provides an exact lookup for the username field which is equivalent to this...

class UserFilter(django_filters.FilterSet):
    class Meta:
        model = User
        fields = {
            'username': ['exact']
        }

I'm looking for a way support all possible lookup filters given the field so that I don't have to do this:

class UserFilter(django_filters.FilterSet):
    class Meta:
        model = User
        fields = {
            "username": ["exact", "iexact", "contains", "icontains", "startswith", ..., etc.]
        }

Solution

  • Override the get_fields(...) class method of FilterSet class as,

    import django_filters as filters
    # If you are using DRF, import `filters` as
    # from django_filters import rest_framework as filters
    
    
    class AnyModelFilter(filters.FilterSet):
        class Meta:
            model = AnyModel
            fields = '__all__'
    
        @classmethod
        def get_fields(cls):
            fields = super().get_fields()
            for field_name in fields.copy():
                lookup_list = cls.Meta.model._meta.get_field(field_name).get_lookups().keys()
                fields[field_name] = lookup_list
            return fields