REST-фреймворк Django 3.12

REST framework 3.12 привносит несколько усовершенствований в генерацию схем OpenAPI, а также поддержку нового класса Django JSONField, не зависящего от базы данных, и некоторые улучшения в классе SearchFilter.

Группировка операций с помощью тегов.

Схемы Open API теперь будут автоматически включать теги, основываясь на первом элементе в пути URL.

Например…

Метод

Путь

Теги

GET , PUT , PATCH , DELETE

/users/{id}/

['users']

GET , POST

/users/

['users']

GET , PUT , PATCH , DELETE

/orders/{id}/

['orders']

GET , POST

/orders/

['orders']

Теги, используемые для конкретного вида, также могут быть переопределены…

class MyOrders(APIView):
    schema = AutoSchema(tags=['users', 'orders'])
    ...

Дополнительную информацию см. в разделе the schema documentation.

Настройка идентификатора операции.

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

Дополнительную информацию см. в разделе the schema documentation.

Поддержка компонентов OpenAPI.

Чтобы выводить более изящные схемы OpenAPI, REST framework 3.12 теперь определяет компоненты в схеме, а затем ссылается на них внутри объектов запроса и ответа. Это контрастирует с предыдущим подходом, который полностью расширял тела запроса и ответа для каждой операции.

Имена, используемые для компонента, по умолчанию используют имя класса сериализатора, but may be overridden if needed

class MyOrders(APIView):
   schema = AutoSchema(component_name="OrderDetails")

Больше публичных API

Многие методы класса AutoSchema теперь переведены в разряд публичных API, что позволяет более полно настраивать генерацию схемы. Следующие методы теперь доступны для переопределения…

  • get_path_parameters

  • get_pagination_parameters

  • get_filter_parameters

  • get_request_body

  • get_responses

  • get_serializer

  • get_paginator

  • map_serializer

  • map_field

  • map_choice_field

  • map_field_validators

  • allows_filters.

Подробнее об использовании пользовательских подклассов the schema docs см. в AutoSchema.

Поддержка JSONField.

Django 3.1 отказался от существующего django.contrib.postgres.fields.JSONField в пользу новой базы данных-агностики JSONField.

REST framework 3.12 теперь поддерживает это новое поле модели, и классы ModelSerializer будут правильно отображать поле модели.

Улучшения SearchFilter

В классе SearchFilter есть несколько значительных улучшений.

Вложенный поиск в JSONField и HStoreField

Класс теперь поддерживает вложенный поиск в пределах JSONField и HStoreField , используя нотацию двойного подчеркивания для обхода элемента поля, к которому должен применяться поиск.

class SitesSearchView(generics.ListAPIView):
    """
    An API view to return a list of archaeological sites, optionally filtered
    by a search against the site name or location. (Location searches are
    matched against the region and country names.)
    """
    queryset = Sites.objects.all()
    serializer_class = SitesSerializer
    filter_backends = [filters.SearchFilter]
    search_fields = ['site_name', 'location__region', 'location__country']

Поиск по полям аннотаций

Django позволяет кверисетам создавать дополнительные виртуальные поля, используя метод .annotate. Теперь мы поддерживаем поиск по аннотированным полям.

class PublisherSearchView(generics.ListAPIView):
    """
    Search for publishers, optionally filtering the search against the average
    rating of all their books.
    """
    queryset = Publisher.objects.annotate(avg_rating=Avg('book__rating'))
    serializer_class = PublisherSerializer
    filter_backends = [filters.SearchFilter]
    search_fields = ['avg_rating']

Финансирование

REST framework - это коллаборативно финансируемый проект. Если вы используете REST framework в коммерческих целях, мы настоятельно рекомендуем вам инвестировать в его дальнейшее развитие путем ** :doc:`signing up for a paid plan <funding>`** **.

Каждая регистрация помогает нам сделать REST framework долгосрочным и финансово устойчивым.

:raw-html-m2r:`<ul class=»premium-promo promo»>

<li><a href=»https://getsentry.com/welcome/» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/sentry130.png)»>Sentry</a></li> <li><a href=»https://getstream.io/try-the-api/?utm_source=drf&utm_medium=banner&utm_campaign=drf» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/stream-130.png)»>Stream</a></li> <li><a href=»https://software.esg-usa.com» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/esg-new-logo.png)»>ESG</a></li> <li><a href=»https://rollbar.com» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/rollbar2. png)»>Rollbar</a></li> <li><a href=»https://cadre.com» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/cadre.png)»>Cadre</a></li> <li><a href=»https://hubs.ly/H0f30Lf0» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/kloudless-plus-text.png)»>Kloudless</a></li> <li><a href=»https://lightsonsoftware. com» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/lightson-dark.png)»>Lights On Software</a></li> <li><a href=»https://retool.com/?utm_source=djangorest&utm_medium=sponsorship» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/retool-sidebar.png)»>Retool</a></li> <li><a href=»https://retool.com/?utm_source=djangorest&utm_medium=sponsorship» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/retool-sidebar.png)»>Retool</a></li>

</ul>`

Большое спасибо всем нашим :doc:`wonderful sponsors <https://fund.django-rest-framework.org/topics/funding/#our-sponsors>`*, и в особенности нашим премиум бэкерам, :doc:`Sentry <https://getsentry.com/welcome/>`**, `Stream <https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf>`_**, :doc:`ESG <https://software.esg-usa.com/>`**, `Rollbar <https://rollbar.com/?utm_source=django&utm_medium=sponsorship&utm_campaign=freetrial>`_**, :doc:`Cadre <https://cadre.com>`**, :doc:`Kloudless <https://hubs.ly/H0f30Lf0>`**, :doc:`Lights On Software <https://lightsonsoftware.com>`**, и `Retool <https://retool.com/?utm_source=djangorest&utm_medium=sponsorship>`_.*.

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