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".