Метод создания категории
Как мы уже помним, у нас есть Pydantic модель, которая находится в файле shemas.py:
class CreateCategory(BaseModel):
name: str
parent_id: int | None
Именно она будет отвечать за создание наших категорий. Откроем файл category в папке routers, и начнем реализацию нашего проекта с метода создания категорий:
from fastapi import APIRouter, Depends, status, HTTPException
from sqlalchemy.orm import Session
from app.backend.db_depends import get_db
from typing import Annotated
from app.models import *
from sqlalchemy import insert
from app.schemas import CreateCategory
from slugify import slugify
@router.post('/create')
async def create_category(db: Annotated[Session, Depends(get_db)], create_category: CreateCategory):
db.execute(insert(Category).values(name=create_category.name,
parent_id=create_category.parent_id,
slug=slugify(create_category.name)))
db.commit()
return {
'status_code': status.HTTP_201_CREATED,
'transaction': 'Successful'
}
Первым делом мы импортируем необходимые нам модули. В нашей функции создания записи мы подключаем зависимость сессии БД, и получаем нашу модель из POST запроса. В SQLAlchemy 2.0 появился новый интерфейс запросов, именно его мы и используем. Подробнее о INSERT вы можете посмотреть в документации. После добавления, для подтверждения изменений у объекта Session вызывается метод commit().
Так как мы хотим получать поле slug динамически, мы это делаем используя библиотеку Slugify, установим ее:
pip install python-slugify
Функция slugify - конвертирует строку, преобразовывая пробелы в дефисы, удаляя символы которые не являются буквенно-цифровыми, подчеркиваниями или дефисами, конвертирует в нижний регистр и удаляет пробелы в начале и конце текста.
Если мы хотим посмотреть аналогию со старыми запросами в SQLAlchemy, то наш запрос выглядел бы следующим образом:
category_model = Category(
name=create_category.name,
parent_id=create_category.parent_id,
slug=slugify(create_category.name)
)
db.add(category_model)
db.commit()
Запустим проект командой uvicorn app.main:app --reload и проверим работу. Перейдем в конечную точку создания категории, и попробуем создать новую категорию:
В результате мы получим код ответа 201, говорящий, что запрос выполнен успешно и привёл к созданию ресурса. Теперь откроем нашу БД в любом редакторе SQLite, и перейдя в таблицу category увидим следующее:
Мы видим что наша категория была успешно создана, ей автоматически было присвоено поле slug и is_active. В следующем шагах мы реализуем вывод всех категорий, а также удаление и изменение категорий.
А почему в документации значится ожидаемый код успешного ответа 200, хотя мы меняли на 201?
@Anonymous_38661511, разобрался. Нужно в декораторе @router.post добавить параметр status_code