Search code examples
djangofilterdjango-rest-frameworkdjango-filters

Making general Filter in Djando Rest Framework


I want to make a common filter to my models because I need to filter all my objects to return a gap between time_start and time_end, but apparently it doesn't work. I'm not sure if it's even possible(But I hope so, because it won't by DRY otherwise).

models.py

class Time(models.Model):
    time = models.TimeField()
    class Meta:
        abstract=True


class Mark(Time):
    value = models.IntegerField(verbose_name="mark")
    teacher = models.CharField(max_length=20)
    subject = models.CharField(max_length=20)

serializers.py

class MarkSerializer(serializers.ModelSerializer):
    class Meta:
        model = Mark
        fields = ('id', 'time','value', 'teacher', 'subject')

filers.py

class DataFilter(django_filters.FilterSet):
    start_time = django_filters.TimeFilter(name="time", lookup_expr='gte')
    end_time = django_filters.TimeFilter(name="time", lookup_expr='lte')

    class Meta:
        model = Time
        fields = ['start_time', 'end_time']

views.py

class MarkViewSet(viewsets.ModelViewSet):
    serializer_class = MarkSerializer
    queryset = Mark.objects.all()
    filter_class = DataFilter

I try to get needed marks through: 127.0.0.1:8000/api/v0/marks/?time_start=11:40:00&time_end=12:00:00 but it returns all the objects that I have not the filtered ones. Thanks in advance.


Solution

  • You have passed the filter params wrong, it should be the name of the field you described in the filter class DataFilter.

    Hit this endpoint in the browser,
    127.0.0.1:8000/api/v0/marks/?start_time=11:40:00&end_time=12:00:00