CRUD Auto — автогенерация REST API¶
Каждая зарегистрированная модель автоматически получает полный набор REST-эндпоинтов. Ноль строк кода — только определение модели.
Генерируемые эндпоинты¶
Для модели с __route__ = "products":
| Метод | URL | Описание |
|---|---|---|
| POST | /products/search |
Поиск с фильтрами и пагинацией |
| POST | /products/create |
Создание записи |
| GET | /products/read/{id} |
Чтение записи по ID |
| PATCH | /products/update/{id} |
Обновление записи |
| DELETE | /products/delete |
Удаление записей |
| GET | /products/read_default_values |
Значения по умолчанию |
Как это работает¶
graph LR
M[DotModel] --> SR[SchemaRegistry]
SR --> PS[Pydantic Schemas]
PS --> CR[CRUDRouterGenerator]
CR --> R[FastAPI Routers]
style M fill:#e3f2fd
style R fill:#e8f5e9
- SchemaRegistry анализирует все поля модели
- Генерирует Pydantic-схемы для валидации (create, update, read, search)
- CRUDRouterGenerator создаёт FastAPI-роутеры с этими схемами
- Роутеры подключаются к приложению при старте
Search API¶
POST /products/search
Content-Type: application/json
{
"filter": [
["active", "=", true],
["price", ">", 100]
],
"fields": ["id", "name", "price", "category_id"],
"order": "price",
"sort": "desc",
"start": 0,
"end": 20,
"limit": 20
}
Ответ:
{
"data": [
{"id": 5, "name": "Widget Pro", "price": 299, "category_id": 2},
{"id": 3, "name": "Widget Basic", "price": 199, "category_id": 1}
],
"total": 42
}
Create API¶
POST /products/create
Content-Type: application/json
{
"name": "New Product",
"price": 199.99,
"category_id": 1,
"active": true
}
Ответ:
Read API¶
Ответ:
{
"data": {
"id": 43,
"name": "New Product",
"price": 199.99,
"category_id": {"id": 1, "name": "Electronics"}
}
}
Update API¶
PATCH /products/update/43
Content-Type: application/json
{
"price": 249.99,
"name": "Updated Product"
}
Кастомные роутеры¶
Для модулей, которым нужна дополнительная логика, создавай обычные FastAPI-роутеры:
backend/base/crm/chat/routers/messages.py
from fastapi import APIRouter, Request
router_private = APIRouter(
prefix="/chats",
tags=["Chat Messages"],
)
@router_private.post("/{chat_id}/messages")
async def send_message(req: Request, chat_id: int, body: MessageCreate):
"""Кастомный эндпоинт с бизнес-логикой."""
env = req.app.state.env
# Проверка прав
await ChatMember.check_can_write(chat_id, user_id)
# Создание через ORM
msg_id = await env.models.chat_message.create(
env.models.chat_message(
chat_id=chat_id,
author_user_id=user_id,
body=body.body,
)
)
# WebSocket уведомление
await env.apps.chat.chat_manager.send_to_chat(chat_id, {...})
return {"data": {"id": msg_id}}
CRUD Auto + кастомные роутеры
Модель может одновременно иметь авто-CRUD роуты и кастомные роутеры. Авто-CRUD покрывает базовые операции, а кастомные — бизнес-логику (чат, транзакции, уведомления).