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] = []