# 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 }