whitebear
whitebear

Reputation: 12433

Use range filter for django rest framework

I want to filter the objects with id. like this below.

fetch more than 12 , between 6 and 12, something like this..

I set RangeFilter() like this but it shows only equal. not more than, less than

class MyTextFilter(filters.FilterSet):
    my_text = filters.CharFilter(lookup_expr='contains')
    id = filters.RangeFilter()

    class Meta:
        model = MyText
        fields = ('id','myText')

Thanks to @Mohammad Ali answer

I alter the code like this ,but still invalid literal for int() with base 10: 'id' error.

from django_filters import rest_framework as filters
class MyTextFilter(filters.FilterSet):
    my_text = filters.CharFilter(lookup_expr='contains')
    id = filters.CharFilter(method='id_filter')
    class Meta:
        model = MyText
        fields = ('id','myText')

def id_filter(self, queryset, value, *args, **kwargs):
    return queryset.filter(id>int(value))

Finally I solve the problem with this.

    return queryset.filter(id__gte=args[0])

Upvotes: 1

Views: 500

Answers (1)

Ali
Ali

Reputation: 2591

You can use filter method for each fields in your filter class.

from django_filters import rest_framework as df_rest_filter

class MyTextFilter(df_rest_filter.FilterSet):
    id = df_rest_filter.CharFilter(method='idFilter')

    class Meta:
        model = MyText
        fields = ('id')

    def idFilter(self, queryset, value, *args, **kwargs):
        if value > 12:
             return queryset.filter(id=value)
        else:
             return queryset

Upvotes: 1

Related Questions