film_recom_sys/helpers.py
2025-01-31 21:36:31 +08:00

55 lines
2.4 KiB
Python

# helpers.py
from models import Movie, Genre, CategorySearch, Search
from extensions import db
def get_recommendations(user_id, page, per_page):
# 初始化推荐结果
common_search_movies = []
liked_genres_movies = []
# 获取“你常搜的”关键词推荐
common_searches = Search.query.filter_by(user_id=user_id).order_by(Search.search_times.desc()).all()
for search in common_searches:
keyword = search.keyword
# 根据关键词查询电影,并按评分从高到低排序
movies_for_keyword = Movie.query.filter(
(Movie.title.contains(keyword)) | (Movie.actor.contains(keyword))
).order_by(Movie.average_rating.desc()).all()
# 添加该关键词的电影到推荐结果
common_search_movies.extend(movies_for_keyword)
# 获取“你喜欢的类型”电影推荐
liked_genres_searches = CategorySearch.query.filter_by(user_id=user_id).order_by(CategorySearch.search_times.desc()).all()
for search in liked_genres_searches:
genre_id = str(search.category_id)
# 生成匹配 genre_id 的 LIKE 查询条件
conditions = [
Movie.genres.like(f"%,{genre_id},%") |
Movie.genres.like(f"{genre_id},%") |
Movie.genres.like(f"%,{genre_id}") |
(Movie.genres == genre_id)
]
# 查询该类别的电影并按评分从高到低排序
movies_for_genre = Movie.query.filter(db.or_(*conditions)).order_by(Movie.average_rating.desc()).all()
# 添加该类别的电影到推荐结果
liked_genres_movies.extend(movies_for_genre)
# 为每部电影添加对应的 genres 名称
for movie in common_search_movies + liked_genres_movies:
genre_ids = movie.genres.split(",") if movie.genres else []
genre_names = Genre.query.filter(Genre.id.in_(genre_ids)).all()
movie.genre_names = ", ".join([genre.name for genre in genre_names])
# 手动分页以控制每页显示数量
common_search_movies_paginated = common_search_movies[(page - 1) * per_page: page * per_page]
liked_genres_movies_paginated = liked_genres_movies[(page - 1) * per_page: page * per_page]
return {
"common_search_movies": common_search_movies_paginated,
"liked_genres_movies": liked_genres_movies_paginated,
"common_search_has_more": len(common_search_movies) > page * per_page,
"liked_genres_has_more": len(liked_genres_movies) > page * per_page
}