Django 5 для начинающих

Прогресс по курсу:  9/1004

8.5 Фильтрация, поиск
5 из 5 шагов пройдено

OrderingFilter

Класс OrderingFilter поддерживает простое упорядочивание результатов, управляемое параметрами запроса.

По умолчанию параметр запроса называется ordering, но его можно переопределить с помощью параметра ORDERING_PARAM.

Например, чтобы упорядочить пользователей по имени пользователя:

http://127.0.0.1:8000/api/?ordering=author_id

Клиент также может указать обратный порядок, добавив к имени поля префикс -, как показано ниже:

http://127.0.0.1:8000/api/?ordering=-author_id

Также можно указать несколько порядков:

http://127.0.0.1:8000/api/?ordering=author_id,publish

Рекомендуется явно указать, какие поля API должен разрешить в фильтре упорядочивания. Это можно сделать, установив атрибут ordering_fields для представления, как показано ниже:

class PostList(generics.ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filterset_fields = ['author']
    search_fields = ['body', 'author__username']
    ordering_fields = ['author_id', 'publish']

Это помогает предотвратить непредвиденную утечку данных, например, разрешение пользователям делать заказы по хэш-полю пароля или других конфиденциальных данных.

Если вы не указали атрибут orderering_fields для представления, класс фильтра будет по умолчанию позволять пользователю фильтровать по любым читаемым полям на сериализаторе, указанном атрибутом serializer_class.

Если вы уверены, что кверисет, используемый представлением, не содержит конфиденциальных данных, вы также можете явно указать, что представление должно разрешить упорядочивание по любому полю модели или агрегату кверисета, используя специальное значение __all__.

class PostList(generics.ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filterset_fields = ['author']
    search_fields = ['body', 'author__username']
    # ordering_fields = ['author_id', 'publish']
    ordering_fields = '__all__'

И мы получим вот такой результат:

 

Указание порядка по умолчанию

Если для представления установлен атрибут ordering, он будет использоваться в качестве упорядочивания по умолчанию.

Обычно вы контролируете это, устанавливая order_by в исходном наборе запросов, но использование параметра ordering в представлении позволяет вам указать упорядочивание таким образом, что оно может быть автоматически передано в качестве контекста шаблону рендеринга. Это позволяет автоматически отображать заголовки столбцов по-разному, если они используются для упорядочивания результатов.

class PostList(generics.ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filterset_fields = ['author']
    search_fields = ['body', 'author__username']
    # ordering_fields = ['author_id', 'publish']
    ordering_fields = '__all__'
    ordering = ['body']

Атрибут orderering может быть либо строкой, либо списком/кортежем строк.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Нет обсуждений. Начните первое.