Search code examples
pythondjangodjango-filter

Django-filter, how to make multiple fields search? (with django-filter!)


How can I make multiple fields search with Django-filter from model like:

class Location(models.Model):
    loc = models.CharField(max_length=100, blank=True)
    loc_mansioned = models.CharField(max_length=100, blank=True)
    loc_country = models.CharField(max_length=100, blank=True)
    loc_modern = models.CharField(max_length=100, blank=True)

I need one input field on my website, that can search over all fields of Location model


Solution

  • You can probably create a custom filter and do something like this:

    from django.db.models import Q
    import django_filters
    
    
    class LocationFilter(django_filters.FilterSet):
        q = django_filters.CharFilter(method='my_custom_filter', label="Search")
    
        class Meta:
            model = Location
            fields = ['q']
    
        def my_custom_filter(self, queryset, name, value):
            return queryset.filter(
                Q(loc__icontains=value) |
                Q(loc_mansioned__icontains=value) | 
                Q(loc_country__icontains=value) | 
                Q(loc_modern__icontains=value)
            )
    

    This would filter by any of of those fields. You can replace the icontains with whatever you want.