📘 DRF
이렇게 했지만 25개의 영화를 어떤 기준에서 보여줄지 논의를 끝마친 게 ↓
겟츠 고 😎
SignUpMoviePreference.zip
0.03MB
DataFrame을 위해서 import 해줍시당
import pandas as pd
import numpy as np
csv 불러오기
# csv 불러 오기
df = pd.read_csv('/Users/baeminkyung/Desktop/github/UNO_BWMovie_recsys/dataset/signup_movie_list.csv')
df
총 행이 100개이고 13개의 칼럼을 가진 파일이에요!
여기서 랜덤으로 25개씩 불러와서 회원 가입 창에서 보여줄 거예요
포스터 사진과 함께요!
랜덤 25개 뽑기
# 랜덤으로 25개 뽑고, id, title, original_title, genres, poster_path 열만 추출, index 번호 새로 부여하기
sampled_df = df.sample(n=25)[['id', 'title', 'original_title', 'genres','poster_path']].reset_index(drop=True)
"""포스터 보기 : https://image.tmdb.org/t/p/w500/<이미지 파일명>"""
# display 함수를 사용하여 DataFrame을 표 형태로 출력
from IPython.display import display
display(sampled_df)
랜덤으로 25개가 계속 나오더라고요
sampled_df = df.sample(n=25)[['id', 'title', 'original_title', 'genres','poster_path']]
나중에 views.py에서 위에 코드를 활용할 예정이에요!
ERD를 토대로 모델 구성하기
작성해 두었던 ERD를 토대로 모델 field를 설정해 주었어요
Movie Preference model
더보기
from django.db import models
from accounts.models import User
from enum import Enum
"""Enum용 모델"""
class PerformEumsType(Enum):
like = "like"
dislike = "dislike"
"""Movie model"""
class Movie(models.Model):
id = models.IntegerField(primary_key=True) # TMDB ID(기존 데이터셋의 ID)
title = models.CharField(max_length=100) # 제목
revenue = models.IntegerField(default=0) # 수익
vote_average = models.FloatField(default=0.0) # 평점
imdb_id = models.CharField(max_length=100, default="") # IMDB ID
original_title = models.CharField(max_length=100) # 원제(개봉국가제목)
overview = models.TextField(default="") # 줄거리
popularity = models.FloatField(default=0.0) # 인기도
genres = models.CharField(max_length=100, default="") # 장르
poster_path = models.CharField(max_length=100, default="") # 포스터 경로(url)
keywords = models.CharField(max_length=100, default="") # 키워드
def __str__(self):
return self.title
"""영화 선호도 정리를 위한 model"""
class MoviePreference(models.Model):
user_id_fk = models.ForeignKey(User, on_delete=models.CASCADE)# FK "유저 ID"
movie_id_fk = models.ForeignKey(Movie, on_delete=models.CASCADE) # FK "영화 ID"
preference_type = models.CharField(
max_length=50,
choices=[(tag.value, tag.name) for tag in PerformEumsType],
default=PerformEumsType.dislike.value) #"선호도 유형 (ENUM: like, dislike)"
# PRIMARY KEY "(user_id_fk, movie_id_fk)"
- 다른 앱에 있는 User의 id 값과 Movie 모델에 있는 id를 ForeignKey로 설정해 주었어요.
- preference_type은 like, dislike로 선택할 거기 때문에 enum에 정의해놓은 걸 데리고 왔어요
- default로 dislike로 해두었습니다!
- 어떻게 구현될지 나중에 front로 확인해봐야 해요 🤔
urls.py
main/urls.py
path("api/v1/movie/", include("movies.urls")) # movies의 url 불러 쓰기
movies/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('movielist/', views.SignUpMovieListView), # Signup movie list로 가기
]
serializers.py
from rest_framework import serializers
from .models import Movie
"""df와 drf를 직렬화"""
class SignupMovieListSerializer(serializers.ModelSerializer):
class Meta:
model = Movie
fields = ['id', 'original_title', 'poster_path']
read_only_fields = ['id']
- Movie 모델에 있는 id, original_title, poster_path 필드만 쓸 거예요.
- id는 오직 읽기 모드로만 할 거예요.
views.py
더보기
from rest_framework.response import Response
from .serializers import SignupMovieListSerializer
from rest_framework.decorators import api_view
import pandas as pd
"""랜덤한 영화 리스트 25개 보여주는 코드"""
@api_view(['GET'])
def SignUpMovieListView(request):
"""이미지 들고올 코드"""
TMDB_IMAGE_BASE_URL = "https://image.tmdb.org/t/p/w500"
"""csv 불러 오기"""
df = pd.read_csv(
'/Users/baeminkyung/Desktop/github/UNO_BWMovie_recsys/dataset/signup_movie_list.csv'
)
"""100개의 original_title, poster_path 열 중에서 25개 랜덤으로 데리고 옴"""
sampled_df = df.sample(n=25)[['original_title', 'poster_path']]
"""poster_path를 완전한 이미지 URL로 변환"""
sampled_df['poster_url'] = TMDB_IMAGE_BASE_URL + sampled_df['poster_path']
data = sampled_df[['original_title', 'poster_url']].to_dict(orient='records')
"""serializer를 사용하여 데이터 변환 및 유효성 검사"""
serializer = SignupMovieListSerializer(data=data, many=True)
if serializer.is_valid():
return Response(serializer.data)
return Response(serializer.errors, status=400) # 에러 처리
"""poster_path를 완전한 이미지 URL로 변환"""
sampled_df['poster_url'] = TMDB_IMAGE_BASE_URL + sampled_df['poster_path']
- 이 코드는 Front 구현할 때 쓰는 게 더 안정적인 코드가 될 거라고 하더라고요
일단은 적어두었고, Front를 함께 구현하게 될 때 다시 수정할 거예요
postman에서 제대로 잘 작동되는지 확인했고, 200 OK 받아냈어요!
혹시나 original_title이 25개가 아닐까 봐 세봤는데 맞더라고요 😋
내일은 genres 모델을 구현할 거예요. 파이팅!
'👥 중간 팀 프로젝트(250212~0225) > 구현 과정' 카테고리의 다른 글
[👤기능구현] 영화 선택과 동시에 장르 저장하기 (0) | 2025.02.24 |
---|---|
[👤기능구현] 이전에 만든 movie 수정 및 Genre model 생성 (0) | 2025.02.22 |
[👤기능구현] LLM에 메모리 기능 구현하기 (0) | 2025.02.20 |
[👤LLM] Parser, Runnable Component 써보기 (0) | 2025.02.19 |
[👤LLM] LangChain, PromptTemplate 써보기 (0) | 2025.02.18 |