<aside> 💡 1. 최근에 개봉한 영화 (1달 이내, 인기도 순서) 2. 요즘 제일 관심 받는 영화 (1달 이내 좋아요, 리뷰 수가 가장 많은 영화) 3. 계절 추천 영화
</aside>
# 영화 추천1. 최근에 개봉한 영화
# 최근 50일 이내 인기도순으로 정렬
now = timezone.now()
movies = Movie.objects.annotate(review_count=Count('review', distinct=True, filter = Q(review__created_at__range=[now-timedelta(days=30), now]))).order_by('-review_count')
serializer = MovieListSerializer(movies, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
출력되는 영화의 수가 적어서, 최근 50일로 기간을 늘렸다.
# 영화 추천2. 요즘 제일 관심받는 영화 (최근 30일 이내 리뷰 수가 많은 영화)
now = timezone.now()
movies = Movie.objects.annotate(
review_count=Count(
'review', distinct=True, filter = Q(
review__created_at__range=[now-timedelta(days=30), now]
))).order_by('-review_count')[:21]
serializer = MovieListSerializer(movies, many=True)
return Response(serializer.data)
충격!!!! __
를 활용하면 역참조 모델의 다른 필드에 접근할 수 있다.
created_at
범위로 filter를 설정한다.즉, 30일이내에 작성한 review의 수가 완성된다!
# 영화 추천3. 계절 추천 영화
# 봄: 로맨스, 여름: 공포, 가을:모험 , 겨울: 판타지
# 인기 99 이상 랜덤(20개 데이터 뽑기)
now = int(timezone.now().strftime('%m'))
if now == 3 or now == 4 or now == 5:
season = 'spring'
elif now == 6 or now == 7 or now == 8:
season = 'summer'
elif now == 9 or now == 10 or now == 12:
season = 'fall'
else:
season = 'winter'
season_code = {
'spring': 10749, 'summer': 27, 'fall': 12, 'winter': 14
}
genre_id = season_code.get(season)
movies = Movie.objects.filter(genre_ids=genre_id, popularity__gt=99).order_by('?')[:21]
serializer = MovieListSerializer(movies, many=True)
return Response(serializer.data)