Django-filters query params conflict

Я пытаюсь работать с фильтрацией db по параметрам запроса из ссылки, которая выглядит следующим образом:

{{url}}/api/books?author="XXX"&from=2003&to=2051&acquired=true

Я уже обработал параметры author и acquired, но застрял с from и to. Мой filter.py выглядит следующим образом:

class BookFilter(django_filters.FilterSet):
      author = django_filters.CharFilter(field_name="authors__fullname", lookup_expr="icontains")

      from = django_filters.NumberFilter(field_name="published_year", lookup_expr="gte")
      to = django_filters.NumberFilter(field_name="published_year", lookup_expr="lte")

      acquired = django_filters.BooleanFilter(field_name="acquired")

      class Meta:
          model = Book
          fields = [
                  "author",
                  "from",
                  "to",
                  "acquired"
                  ]

Я ищу способ назначить эти параметры запроса без перезаписи ключевых слов (from и to), что, очевидно, является ужасной идеей.

Вам не нужно определять специальный класс BookFilter. Эту задачу можно просто решить на уровне представления. Просто определите класс DateFilter для фильтрации по датам, а другие типы фильтров, такие как поиск по имени или заказ по цене, можно реализовать на уровне представления. типы фильтров, такие как поиск по имени или порядок по цене, могут быть реализованы на уровне представления. (Убедитесь, что в вашей модели есть поле created_at) . Вот пример

from django_filters import rest_framework as rest_filters

from apps.yourappname.models import YourModel

from django_filters import rest_framework as rest_filters


class DateFilter(rest_filters.FilterSet):   
  created_at = rest_filters.DateFromToRangeFilter()

  class Meta:
     model = YourModel
     fields = ['created_at']

class YourAPIView(ListAPIView):
  serializer_class = YourModelSerializer
  filter_backends = [filters.SearchFilter, filters.OrderingFilter, 
                     rest_filters.DjangoFilterBackend, ]

  filter_class = DateFilter
  search_fields = ['authors__fullname' ]
  ordering_fields = [ 'created_at', ]

def get_queryset(self):
    dataset_queryset = YourModel.objects.filter(id=self.request.user.id)
    return dataset_queryset

Когда вы фильтруете по дате, ваш URL будет выглядеть следующим образом: http://127.0.0.1:8000/api/yourappname/id/files/?created_at_after=2022-04-19&created_at_before=2022-05-28

Для всех, у кого может возникнуть такая же проблема: Мне удалось создать обходной путь, в котором я создаю копию querydict, pop() значения "from" и "to" и присваиваю их вновь созданным ключам "from_date" и "to_date".

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