api/answer/create/{question_id}
⇒ post, 질문{question_id}에 대한 답변을 등록
답변 등록 라우터에서 content의 값을 읽기 위해서는 반드시 content 항목을 포함하는 Pydantic 스키마를 통해 읽어야 한다.
get이 아닌 post, put, delete의 입력 값은 pydantic 스키마로만 읽을 수 있다.
규칙
스키마 → crud → router 순으로 개발
출력은 response_model을 사용하는 대신
status_code=status.HTTP_204_NO_CONTENT
를 사용했다. 이렇게 리턴할 응답이 없을 경우에는 응답코드 204를 리턴하여 "응답 없음"을 나타낼 수 있다.
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from starlette import status
from database import get_db
from domain.answer import answer_schema, answer_crud
from domain.question import question_crud
from models import Answer
router = APIRouter(
prefix="/api/answer",
)
@router.post("/create/{question_id}",
status_code=status.HTTP_204_NO_CONTENT )
def create_answer(question_id: int,
_answer_create: answer_schema.AnswerCreate,
db: Session = Depends(get_db)):
#create answer
question = question_crud.get_question(db, question_id=question_id)
if not question:
raise HTTPException(status_code=404, detail="Question not found")
answer_crud.create_answer(db, question=question,
answer_create=_answer_create)
class AnswerCreate(BaseModel):
content: str
@field_validator("content")
def not_empty(cls, v):
if not v or not v.strip():
raise ValueError("빈 값은 허용되지 않습니다.")
return v
#Answer 스키마는 출력으로 사용할 답변 1건(단 건)을 의미한다.
class Answer(BaseModel):
id: int
content: str
create_date: datetime.datetime
answers: list[Answer] = []