Фильтрация поля диапазона дат с помощью диапазона дат

ПриложениеReact/Django. Я хочу добавить фильтр диапазона дат (flatpickr) к уже существующим фильтрам для заказов. У заказов есть поле period (как долго действует заказ), которое является полем DateRange. Через flatpickr я выбираю диапазон дат, и если хотя бы один день из периода действия заказа находится в этом выбранном диапазоне дат, он должен отобразиться в результате.

экз. период: DateRange(datetime.date(2021, 2, 11), datetime.date(2021, 3, 14), '[)')

У меня есть готовый фильтр в FE, чтобы принимать результаты из BE. Но я не уверен, как добиться этого в BE. Поскольку я довольно новичок в этом деле, мои идеи ограничены, но в настоящее время я имею следующее:

...
from django_filters.rest_framework import DjangoFilterBackend, IsoDateTimeFilter, FilterSet
from rest_framework import filters, mixins, status
...

class OrderFilter(FilterSet):

    start_date = IsoDateTimeFilter(field_name="period", lookup_expr="gte")
    end_date = IsoDateTimeFilter(field_name="period", lookup_expr="lte")

    class Meta:
        model = Order
        fields = {
            "status": ["in"],
            "client": ["exact"],
            "created_by": ["exact"],
        }

        ordering_fields = ["period", "client__name", "destination__name"]
        ordering = ["period"]
        custom_field_target_model = Order

Я полагаю, что самое близкое, что я нашел, это IsoDateTimeFromToRangeFilter, но это, похоже, не то, что я ищу.

вам нужно добавить начальную и конечную дату к вашим мета-полям, чтобы они работали

Для DateRangeField можно использовать DateFromToRangeFilter. Поскольку фильтры работают с типами полей, необходимо проверить значение field_class фильтра.

class DateFromToRangeFilter(RangeFilter):
    field_class = DateRangeField

Если вы хотите фильтровать начальную и конечную дату/время(ы) отдельно, вы можете оба раза проверить, находится ли данный ввод в периоде или нет. Вы также можете искать с помощью range для DateRangeFields.

queryset.filter(created_at__range=(start_date, end_date))

это должно сработать и в вашем случае.

Нет: Как упомянул @aberkb, вам нужно добавить "period" к полям.

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