AXV

CRUD: model, schema, validatsiya

CRUD, Book modeli, Pydantic sxemalar, Field cheklovlari, POST, GET, PUT/PATCH, DELETE, HTTPException, Form

10-sinfAdvanced Python Back-end5-hafta · 14-dars

Bugun nimalarni o'rganamiz?

Model va schema

Book, Field, validatsiya

Create va Read

POST va GET

Update va Delete

PATCH, DELETE, 403

Takrorlash

Himoyalangan endpointga qaysi dependency foydalanuvchini beradi?

Depends(get_current_user) tokenni tekshirib User qaytaradi.
01

Model va schema

Book, Field, validatsiya

Ikki qatlam

So'rov (JSON) Pydantic:validatsiya SQLAlchemymodel PostgreSQL Noto'g'ri ma'lumot bazaga yetmasdan to'xtatiladi

Book va sxemalar


class Book(Base):
    __tablename__ = "books"
    id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    title: Mapped[str] = mapped_column(String(200))
    author: Mapped[str | None] = mapped_column(String(120))
    pages: Mapped[int | None]
    owner_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"))

class BookCreate(BaseModel):
    title: str = Field(min_length=2, max_length=200)
    author: str | None = Field(default=None, max_length=120)
    pages: int | None = Field(default=None, gt=0, le=5000)

class BookRead(BookCreate):
    model_config = ConfigDict(from_attributes=True)
    id: uuid.UUID
  
gt — kattaroq, le — kichik yoki teng. pages=-5 yuborilsa FastAPI avtomatik 422 Unprocessable Entity qaytaradi, bazaga bormaydi.

Mini-test

BookCreate sxemasida nega id yo'q?

Foydalanuvchi id yubormaydi: UUID ni model default=uuid4 bilan beradi.
02

Create va Read

POST va GET

POST /books

BookCreatetekshiruvi Book(...)obyekti db.add+ commit refresh va 201 Har bosqich qo'llanmadagi ketma-ketlikka mos

Create va Read


@router.post("/", response_model=BookRead, status_code=201)
async def create_book(data: BookCreate, db: AsyncSession = Depends(get_db),
                      user: User = Depends(get_current_user)):
    book = Book(**data.model_dump(), owner_id=user.id)
    db.add(book)
    await db.commit()
    await db.refresh(book)
    return book

@router.get("/", response_model=list[BookRead])
async def list_books(db: AsyncSession = Depends(get_db)):
    return (await db.scalars(select(Book))).all()

@router.get("/{book_id}", response_model=BookRead)
async def get_book(book_id: uuid.UUID, db: AsyncSession = Depends(get_db)):
    book = await db.get(Book, book_id)
    if book is None:
        raise HTTPException(404, "Kitob topilmadi")
    return book
  
db.refresh(book) bo'lmasa, commit dan keyin bazada yaratilgan maydonlar (created_at) javobda eskirgan bo'lishi mumkin.

Mini-test

Muvaffaqiyatli yaratilgan resurs uchun odatiy status kodi?

POST muvaffaqiyatida 201.
03

Update va Delete

PATCH, DELETE, 403

PATCH va DELETE

Kitobnitoping (404?) Egasimi?(403?) O'zgartiring/ o'chiring commit Avval tekshir, keyin o'zgartir

Update va Delete


@router.patch("/{book_id}", response_model=BookRead)
async def update_book(book_id: uuid.UUID, data: BookUpdate,
                      db: AsyncSession = Depends(get_db),
                      user: User = Depends(get_current_user)):
    book = await db.get(Book, book_id)
    if book is None:
        raise HTTPException(404, "Kitob topilmadi")
    if book.owner_id != user.id:
        raise HTTPException(403, "Bu kitob sizniki emas")
    for key, value in data.model_dump(exclude_unset=True).items():
        setattr(book, key, value)
    await db.commit()
    await db.refresh(book)
    return book
  
DELETE uchun status_code=204 qo'yish va await db.delete(book) dan keyin commit qilish odatiy. Avval topmasdan o'chirish noto'g'ri: 404 ni qaytara olmaysiz.

Mini-test

Faqat yuborilgan maydonlarni yangilash uchun nima ishlatiladi?

exclude_unset=True yuborilmagan maydonlarni tashlab yuboradi.

PUT va PATCH

PUT

Resursni to'liq almashtiradi; barcha maydonlar yuboriladi
VS

PATCH

Faqat yuborilgan maydonlarni o'zgartiradi (exclude_unset=True)

Qisman yangilash uchun PATCH qulayroq.

Atamalar. Bosing

CRUD

bosing

Create, Read, Update, Delete

201 / 204

bosing

Yaratildi / mazmunsiz javob (o'chirildi)

422

bosing

Pydantic validatsiya xatosi

HTTPException

bosing

FastAPI da xato javobini qaytarish

CRUD qurish tartibi

1. Model va sxema

Book, BookCreate, BookRead.

2. Endpointlar

POST, GET, PATCH, DELETE.

3. Test

Swagger /docs da har birini sinang.

CRUD jadvali

AmalHTTPSQL
CreatePOSTINSERT
ReadGETSELECT
UpdatePUT / PATCHUPDATE
DeleteDELETEDELETE

Pastga bosing: Swagger da sinash

Swagger da sinash

  1. Authorize bilan kiring, POST /books ni bajaring (201).
  2. GET /books va GET /books/{id} bilan o'qing.
  3. PATCH va DELETE ni sinab, boshqa egada 403 oling.

Qisman yangilash


book.title = data.title
  

Qisman yangilash


for key, value in data.model_dump(exclude_unset=True).items():
    setattr(book, key, value)
  

CRUD raqamlarda

0
amal: C, R, U, D
0
kod: yaratildi
0
kod: topilmadi

Har amal uchun to'g'ri status kod muhim.

Amaliy topshiriq 20 daqiqa

OsonCRUD juftlash: C, R, U, D harflarini HTTP metodi va SQL buyrug'i bilan juftlang.
O'rtaCreate: POST /books endpointini yozing (egasi joriy foydalanuvchi, status 201).
QiyinDelete: DELETE /books/{id} ni yozing: 404, egasi bo'lmasa 403, muvaffaqiyatda 204.

Dars xulosasi

CRUD

POST, GET, PUT/PATCH, DELETE.

Model va sxema

Model — baza, sxema — kirish va chiqish.

Xatolar

404 topilmadi, 403 ruxsat yo'q, 422 validatsiya.

Uyga vazifa: Book CRUD va egalik tekshiruvi.

Keyingi dars: Filtrlash, qidiruv, tartiblash

Query parametrlar, ilike, order_by, pagination

5-hafta · 15-dars