Как добавить пример в поле чванства - PullRequest
0 голосов
/ 19 июня 2020

В настоящее время я использую следующие библиотеки: django -

Django==2.2.4
django-pdb==0.6.2
django-rest-swagger==2.2.0
django-service-objects==0.5.0
django-timezone-field==3.0
django-windows-tools==0.2.1
djangorestframework==3.10.2
djongo==1.2.33

Он работает на Python версии 3.7.4

Проблема, с которой я столкнулся, заключается в том, что я могу для создания части тела API с помощью corapi.Field в Autoschema.

class SwaggerSchemaView(APIView):
    permission_classes = [AllowAny]
    renderer_classes = [
        renderers.OpenAPIRenderer,
        renderers.SwaggerUIRenderer
    ]

    def get(self, request):
        generator = SchemaGenerator()
        schema = generator.get_schema(request=request)

        return Response(schema)
class ParseResume(APIView):
    permission_classes = [AllowAny]
    schema = AutoSchema(
        manual_fields=[
            coreapi.Field(
                "data",
                required=True,
                location="body",
                description='Send Json Data',
                type="string",
                schema=coreschema.Object(),

            )
        ]
    )

    def post(self, request):
        data = request.data
        response_data = SetConnections.parse_resume(data)
        return Response(response_data)

Теперь я могу сгенерировать представление Swagger следующим образом:

введите здесь описание изображения

Но я хочу добавить образец данных внутри этой части тела через coreapi.Field, как показано ниже -

{
      "id": "56-df-pt",
      "fname": "John",
      "lname": "Doe",
      "experience": {
          "employee": "Company X",
          "period": "1996 - 2002",
          "engaged_in": [
                {
                   "work": "Jr. Manager",
                   "team_size": 5,
                   "time": "Sep. 1996 - Dec. 1998"
                },
                {
                   "work": "Sr. Manager",
                   "team_size": 5,
                   "time": "Jan. 1999 - Dec. 2002"
                },
           ]
  }

Как я могу это добавить? Я не могу сейчас изменить какую-либо версию Django или Python.

1 Ответ

0 голосов
/ 20 июля 2020

После долгих дней поиска решения о том, как отображать вложенные объекты в чванстве, я обнаружил, что следующий python пакет:

django-rest-swagger

не отображать вложенные объекты, если сериализатор содержит вложенные поля (отношения), как я узнал об этом?, проверка на сайте rest-framework о генераторе схем:

https://www.django-rest-framework.org/coreapi/schemas/#third -party-packages

Есть строка, в которой упоминается другой пакет под названием:

drf-yasg

https://drf-yasg.readthedocs.io/en/stable/index.html

Этот пакет имеет улучшенные функции, такие как: вложенные схемы , именованные модели, тела ответа, валидаторы enum / pattern / min / max, параметры формы и т. д. c. Таким образом, я решил установить пакет, выполнив следующие шаги:

pip install -U drf-yasg

После установки пакета вы должны добавить модуль в список модулей в settings.py и некоторые дополнительные настройки, которые я рассмотрел. подходящее:

....
THIRD_APPS = [
    'rest_framework',
    'rest_framework_swagger',
    'django_filters',
    'django_celery_beat',
    'drf_yasg',
]

INSTALLED_APPS += THIRD_APPS

# Django restframework
REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        # 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
        # 'rest_framework.permissions.IsAuthenticated',
        # 'rest_framework.permissions.IsAuthenticatedOrReadOnly',
        'rest_framework.permissions.AllowAny',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ],
    'DEFAULT_FILTER_BACKENDS': [
        'django_filters.rest_framework.DjangoFilterBackend',
    ],
    'COERCE_DECIMAL_TO_STRING': False,
}

SWAGGER_SETTINGS = {
    'USE_SESSION_AUTH': True,
    'LOGIN_URL': 'rest_framework:login',
    'LOGOUT_URL': 'rest_framework:logout',
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.JSONParser',
    ],
    'JSON_EDITOR': False,
}

затем перейдите к go в мой urls.py и добавьте следующие строки для создания представления схемы:

  • Импортируйте необходимые модули на apps / dol / urls.py
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
  • настройте начальные параметры функции на apps / dol / urls.py , чтобы не отображались все URL-адреса API, я создал переменную dol_patterns для хранения URL-адресов, необходимых для отображения:
app_name = 'module_dol'
dol_patterns = [
    url(r'^dol/api/?', include('apps.dol.api.urls')),
]

SchemaView = get_schema_view(
    openapi.Info(
        title="API Interface Dol",
        default_version='v1',
        description="API REST",
        # terms_of_service="https://www.google.com/policies/terms/",
        # contact=openapi.Contact(email="email@yourdomain.com"),
        license=openapi.License(name="BSD License"),
    ),
    patterns=dol_patterns,
    public=True,
    permission_classes=(permissions.AllowAny,),
)
  • My main settings / urls.py file:
urlpatterns = [
    url(r'^api-auth/?',
        include('rest_framework.urls', namespace='rest_framework'),),
    url(r'^admin/?', admin.site.urls),
    ....
    ....
    url(r'^dol/', include('apps.dol.urls', namespace='dol'),),
]
  • Здесь мои зарегистрированные URL-адреса apps / dol / urls.py :
urlpatterns = [
    ......
    ......
    url(r'^swagger(?P<format>\.json|\.yaml)$',
        SchemaView.without_ui(cache_timeout=0), name='schema-json'),
    url(r'^swagger/$',
        SchemaView.with_ui('swagger', cache_timeout=0),
        name='schema-swagger-ui'),
    url(r'^redoc/$',
        SchemaView.with_ui('redoc', cache_timeout=0),
        name='schema-redoc'),
    url(r'^api/', include('apps.dol.api.urls')),
]
  • конечные точки представления на основе классов были созданы с помощью следующих универсальных типов:
from rest_framework.generics import (
    CreateAPIView, UpdateAPIView, DestroyAPIView,
)
  • вдобавок вот так выглядит мои apps / dol / api / urls.py :
....
....
urlpatterns = [
    re_path(r"^registration/?$",
            v.ApiDolRegistration.as_view(), name='api-registration'),
    re_path(r"warranty/(?P<coupon_number>[0-9]{5,6})/?$",
            v.ApiDolWarranty.as_view(), name='api-warranty'),
    re_path(r"rejection/(?P<coupon_number>[0-9]{5,6})/?$",
            v.ApiDolRejection.as_view(), name='api-removal'),
]

  • наконец-то раз он настроен правильно, вы сможете увидеть GUI, например, следующее:

enter image description here

  • When ure ready to test the API from the GUI, u will see that the data layer will be editable to modify the json tree :

введите описание изображения здесь

  • Последнее замечание о вложенных объектах, чтобы отобразить вложенные объекты, вы должны быть уверены, что поле сериализатора имеет свойство read_only = False , иначе поле не будет отображаться в GUI.
    ....
    ....
    owner_user = ClientesSerializers(
        fields=Client.FIELDS,
        read_only=False,
    )

    class Meta:
       ....
       ....

Я очень надеюсь, что предоставленная информация будет кому-то полезна.

Приветствую,

...