From 8523328b9fc13d6447dff6a65e9b0f802b3657f3 Mon Sep 17 00:00:00 2001 From: wowlikon Date: Thu, 29 May 2025 00:16:19 +0300 Subject: [PATCH] relationship fix --- app/main.py | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/app/main.py b/app/main.py index 4c6e2ca..c09d5d7 100644 --- a/app/main.py +++ b/app/main.py @@ -4,7 +4,7 @@ from fastapi import FastAPI, Depends, HTTPException from sqlmodel import SQLModel, Session, select from typing import List from .database import engine, get_session -from .models import Author, AuthorBase, Book, BookBase +from .models import Author, AuthorBase, Book, BookBase, AuthorBookLink alembic_cfg = Config("alembic.ini") app = FastAPI( @@ -69,16 +69,24 @@ def delete_author(author_id: int, session: Session = Depends(get_session)): if not db_author: raise HTTPException(status_code=404, detail="Author not found") session.delete(db_author) + author = AuthorBase(name=db_author.name) session.commit() - return {"message": "Author deleted"} + return author -# Create a book +# Create a book with authors @app.post("/books/", response_model=Book, tags=["books"]) -def create_book(book: BookBase, session: Session = Depends(get_session)): - session.add(book) +def create_book(book: BookBase, author_ids: List[int] | None = None, session: Session = Depends(get_session)): + db_book = Book(title=book.title, description=book.description) + session.add(db_book) session.commit() - session.refresh(book) - return book + session.refresh(db_book) + # Create relationships if author_ids are provided + if author_ids: + for author_id in author_ids: + link = AuthorBookLink(author_id=author_id, book_id=db_book.id) + session.add(link) + session.commit() + return db_book # Read books @app.get("/books/", response_model=List[Book], tags=["books"]) @@ -86,24 +94,37 @@ def read_books(session: Session = Depends(get_session)): books = session.exec(select(Book)).all() return books -# Update a book +# Update a book with authors @app.put("/books/{book_id}", response_model=Book, tags=["books"]) -def update_book(book_id: int, book: Book, session: Session = Depends(get_session)): +def update_book(book_id: int, book: BookBase, author_ids: List[int] | None = None, session: Session = Depends(get_session)): db_book = session.get(Book, book_id) if not db_book: raise HTTPException(status_code=404, detail="Book not found") + db_book.title = book.title - db_book.authors = book.authors + db_book.description = book.description session.commit() session.refresh(db_book) + # Update relationships if author_ids are provided + if author_ids is not None: + # Clear existing relationships + existing_links = session.exec(select(AuthorBookLink).where(AuthorBookLink.book_id == book_id)).all() + for link in existing_links: + session.delete(link) + # Create new relationships + for author_id in author_ids: + link = AuthorBookLink(author_id=author_id, book_id=db_book.id) + session.add(link) + session.commit() return db_book # Delete a book -@app.delete("/books/{book_id}", tags=["books"]) +@app.delete("/books/{book_id}", response_model=BookBase, tags=["books"]) def delete_book(book_id: int, session: Session = Depends(get_session)): db_book = session.get(Book, book_id) if not db_book: raise HTTPException(status_code=404, detail="Book not found") + book = Book(title=db_book.title, description=db_book.description) session.delete(db_book) session.commit() - return {"message": "Book deleted"} + return book