55 lines
2.4 KiB
Python
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
|
|
}
|
|
|
|
|