Possible to do an `in` `lookup_type` through the django-filter URL parser?

后端 未结 7 1282
野性不改
野性不改 2020-12-09 17:52

I\'m using django-filter with django-rest-framework and I\'m trying to instantiate a filter that accepts lists of numbers for filtering the query set down

c         


        
7条回答
  •  Happy的楠姐
    2020-12-09 18:43

    Based on @yndolok answer I have come to a general solution. I think filtering by a list of ids is a very common task and therefore should be included in the FilterBackend:

    class ListFilter(django_filters.Filter):
    
        """Class to filter from list of integers."""
    
        def filter(self, qs, value):
            """Filter function."""
            if not value:
                return qs
            self.lookup_type = 'in'
            try:
                map(int, value.split(','))
                return super(ListFilter, self).filter(qs, value.split(','))
            except ValueError:
                return super(ListFilter, self).filter(qs, [None])
    
    
    class FilterBackend(filters.DjangoFilterBackend):
    
        """A filter backend that includes ListFilter."""
    
        def get_filter_class(self, view, queryset=None):
            """Append ListFilter to AutoFilterSet."""
            filter_fields = getattr(view, 'filter_fields', None)
    
            if filter_fields:
                class AutoFilterSet(self.default_filter_set):
                    ids = ListFilter(name='id')
    
                    class Meta:
                        model = queryset.model
                        fields = list(filter_fields) + ["ids"]
    
                return AutoFilterSet
    
            else:
                return super(FilterBackend, self).get_filter_class(view, queryset)
    

提交回复
热议问题