TIL 240527

hyeo71·2024년 5월 27일
0

2024 내배캠 AI 트랙

목록 보기
102/108

Synopsis, Summary refactor

Synopsis

기존에 만든 SynopsisAPIView를 삭제하고 해당 기능을 BookListAPIView의 post method로 조정

Synopsis는 책의 뼈대가 되는 배경과 소설책의 제목을 반환하기 때문에 책의 제목을 저장하는 Book table에 넣는 것이 올바르다고 판단하여 BookListAPIView의 API endpoint를 사용

class BookListAPIView(ListAPIView):
    # 전체 목록 조회
    queryset = Book.objects.all().order_by("-created_at")
    serializer_class = BookSerializer

    # 새 소설 책 생성
    def post(self, request):
        user_prompt = request.data.get("prompt")
        if not user_prompt:
            return Response(
                {"error": "Missing prompt"}, status=status.HTTP_400_BAD_REQUEST
            )

        content = synopsis_generator(user_prompt)  # ai로 title, synopsis 생성
        title = content["title"]
        synopsis = content["synopsis"]
        serializer = BookSerializer(
            data={"title": title, "user_id": request.user.pk}
        )  # db에 title, user_id 저장
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(
                data={'book_id':serializer.data['id'],"content": synopsis},  # FE에 content 응답
                status=status.HTTP_201_CREATED,
            )

Summary

소설책의 내용을 생성하는 SummaryAPIView는 생성하는 소설의 내용이 Book table의 소설과 같은 book_id를 가져야하기 때문에 이를 url에서 받는 BookDetailView의 post method에 구현하는 것으로 조정

def post(self, request, book_id):
        summary = request.data.get("summary")
        if not summary:
            return Response(
                {"error": "Missing summary prompt"}, status=status.HTTP_400_BAD_REQUEST
            )
        result = summary_generator(summary)
        book=get_object_or_404(Book, id=book_id)
        serializer = ChapterSerializer(
            data={"content": result["final_summary"], "book_id": book.pk}
        )
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            result['book_id']=book.pk
            return Response(data=result, status=status.HTTP_201_CREATED)

0개의 댓글