Как фильтровать по полям Date в пакете Django-filter?

Моя модель

class Metric(models.Model):

    date = models.DateField()
    channel = models.CharField(max_length=50)
    country = models.CharField(max_length=10)
    os = models.CharField(max_length=10)

Я использую django-filter для фильтрации записей. Может ли кто-нибудь помочь, как я могу фильтровать по временному диапазону (достаточно дата_от+дата_до). Например, в параметре запроса пользователь указывает /metrics?date-gte='2021-08-17'&date-lte='2021-08-19'

моя точка зрения

class MetricViewSet(viewsets.ModelViewSet):
    serializer_class = MetricSerializer
    queryset = Metric.objects.all()
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['country', 'channel','os']

Вместо использования filterset_fields для автоматического создания набора фильтров задайте его с помощью filterset_class (Docs) и используйте DateFromToRangeFilter [django-filter docs] для обеспечения фильтрации по диапазону дат:

from django_filters import rest_framework as filters


class MetricFilter(filters.FilterSet):
    date = filters.DateFromToRangeFilter()

    class Meta:
        model = Metric
        fields = ['country', 'channel', 'os', 'date']


class MetricViewSet(viewsets.ModelViewSet):
    serializer_class = MetricSerializer
    queryset = Metric.objects.all()
    filter_backends = [filters.DjangoFilterBackend]
    filterset_class = MetricFilter

Вы можете предоставить параметры запроса типа /metrics?date_after=2021-08-17&date_before=2021-08-19.

Я думаю, что Metric.objects.filter(date__range('2021-08-17', '2021-08-19')) может справиться с этой задачей? Возможно, вам нужно сначала преобразовать строку даты в объект даты.

Для справки: Range

Вернуться на верх