Библиотека для быстрого создания универсального RESTful API без написания кода на основе моделей. Построена на платформе Django REST framework.
Универсальный API предоставляет возможности:
Более подробно с возможностями ADAPI можно ознакомиться в документации по ссылке ссылка
Для того чтобы использовать adapi
достаточно произвести установку пакета, и необходимых настроек,
после чего необходимо подключить модели для которых хотим создать универсальный API:
../urls.py
from ... import ModelName, ...
from adapi.router import base_router
base_router.register_model(ModelName)
...
Все. RESTful API со всеми возможностями описанными [выше](#main) готов!
Установка с использованием pip
(рекомендуется)…
$ pip install git+https://git.digitatl.ru/nazarov-na/adapi.git
Или из источника...
$ git clone https://git.digitatl.ru/nazarov-na/adapi.git
$ cd adapi
$ pip install -e . ---
Необходимые настройки settings.INSTALLED_APPS
.
INSTALLED_APPS = [
...
'rest_framework',
'django_filters',
'wq.db.rest',
'adapi',
...
] # <a name="example"></a> Примеры
Размер страницы можно варьировать параметром page_size
запроса. Номер страницы указывается в параметре page
.
/example/?page_size=100&page=3 ### Сортировка
Сортировку можно установить с помощью параметра (ordering
).
/example/?ordering=id ### Фильтрация
Фильтры можно установить указав поле поиска (при необходимости указать тип поиска) и значение.
/example/?name=Организация
/example/?id__in=1,2,3,4
Поиск по текстовым полям можно установить с помощью параметра (search
).
/example/?search=организац
Получение ответа с вложенными полями вынесенными в отдельную секцию можно получить задав параметр include
.
Вложенные объекты можно получить из секции include
по ключам соответствующим наименованиям объектов(параметр related_model_name
в OPTIONS запросе).
Для случая, когда необходимо вынести в отдельную секцию все объекты ссылочного типа, необходимо в параметре запроса include
установить значение all
.
Но, если Вам нужно вынести в секцию include
только одно/несколько вложенных полей, то в параметре include
необходимо перечислить эти поля.
Например, Вам нужен список статей(articles) и список комментариев к каждой статье:
/articles?include=comments — запрашиваем статью с комментариями
"results":
{
"data":
[
{
"id": 1
"title": "Статья 1"
"author": "Автор 1"
"comments": "1"
},
{
"id": 2
"title": "Статья 1"
"author": "Автор 1"
"comments": "2"
},
{
"id": 3
"title": "Статья 2"
"author": "Автор 2"
"comments": "3"
}
]
"include":
{
"Comments":
[
{
"id":1
"title": Комментарий 1
},
{
"id":2
"title": Комментарий 2
},
{
"id":3
"title": Комментарий 3
}
]
}
} ### Добавление ответа табличными частями при операции Retrieve
При операции Retrieve поля объекта дополняются его табличными частями. Например, Вы делаете запрос к документу ПриходТовара, имеющего табличную часть СписокТоваров
GET /product_arrival/1
{
"data": {
"id": 1,
"number": 00001,
"posted": false,
"deletion_mark": true,
"date": "2021-11-30T09:00:00Z",
"list_of_products": [
{
"id": 1,
"line_number": 1,
"owner": 1,
"name": "Утюг"
},
{
"id": 2,
"line_number": 2,
"owner": 1,
"name": "Сковородка"
}
],
}
} ### Дополненные возможности операций CREATE, UPDATE для сохранения табличных частей вместе с сохраняемым объектом
Для сохранения объектов вместе с табличными частями необходимо в теле запроса передать табличные части как поля объекта. При этом, отсутствующие в теле запроса записи табличных частей будут удалены. Например, Вы создаете новый документ ПриходТовара, имеющий табличную часть СписокТоваров
POST /product_arrival
ТелоЗапроса
{
"date": "2021-11-30T09:00:00Z",
"list_of_products": [
{
"line_number": 1,
"owner": 1,
"name": "Утюг"
},
{
"line_number": 2,
"owner": 1,
"name": "Сковородка"
}
],
}
Ответ
{
"id": 1
"number": 00001,
"posted": false,
"deletion_mark": true,
"date": "2021-11-30T09:00:00Z",
"list_of_products": [
{
"id": 1,
"line_number": 1,
"owner": 1,
"name": "Утюг"
},
{
"id": 2,
"line_number": 2,
"owner": 1,
"name": "Сковородка"
}
],
}
Или например, Вы обновляете существующий документ ПриходТовара, имеющий табличную часть СписокТоваров
PATCH или PUT /product_arrival/1
ТелоЗапроса
{
"id": 1
"number": 00001,
"posted": false,
"deletion_mark": true,
"date": "2021-11-30T09:00:00Z",
"list_of_products": [
{
"id": 1,
"line_number": 1,
"owner": 1,
"name": "Утюг"
},
{
"line_number": 2,
"owner": 1,
"name": "Сковородка"
}
],
}
Ответ
{
"id": 1
"number": 00001,
"posted": false,
"deletion_mark": true,
"date": "2021-11-30T09:00:00Z",
"list_of_products": [
{
"id": 1,
"line_number": 1,
"owner": 1,
"name": "Утюг"
},
{
"id": 2,
"line_number": 2,
"owner": 1,
"name": "Сковородка"
}
],
} ### Выбор полей в ответе
Выбрать какие поля будут содержаться в ответе можно с помощью параметра параметр fields
Например, Вам нужен список пользователей, но вас интересуют только поля “id” и “username”:
GET /users/?fields=id,username
[
{
"id": 1,
"username": "user1"
},
{
"id": 2,
"username": "user2"
}
] ### Группировка результатов с расчетом агрегатных функций
Для расчета агрегатных функций (суммы, среднего, подсчета количества, поиск максимума/минимума) по полям с группировкой
необходимо указать в параметре fields
тип агрегатной функции.
Например, Вам нужен список наименований товаров, с суммой по полю number_of_sales
для каждого товара:
GET /product/?fields=name,number_of_sales__sum
[
{
"name": "Утюг",
"number_of_sales__sum": 100
},
{
"name": "Репа",
"number_of_sales__sum": 400
}
]
OPTIONS-запрос предоставляет дополнительные сведения о моделе. Информация связным моделям(поля типа ForeignKey) содержится в ключах
"related_model_name": Имя модели в CamelCase,
"related_model_url": URL до модели,
"related_model_detailed": Поля связной модели
Общая информация содержится в ключах
По ключу “extra_actions” предоставляется список доступных actions к объекту
По ключу “content_type_id” id модели в таблице ContentType - этот id необходим для работы с типом поля GenericForeignKey
URL генерируется путем перевода наименования модели в CamelCase в разделенные дефисом слова.
Например: модель ExampleTable
будет иметь URL example-table