需求
用户以此选择偏好电影的国家/地区、类别、主演,并根据用户的选择,推荐具有代表性的电影,用户选择喜好的电影后,将所选电影加入推荐系统,用来做后续的推荐。
models.py
使用movie和user的model
class Movie(Document):
movieId=IntField()
source=DictField()
name = StringField()
nameFrn = StringField()
directors = ListField(StringField())
writers = ListField(StringField())
stars = ListField(StringField())
types = ListField(StringField())
country = ListField(StringField())
language = ListField(StringField())
releaseDate = ListField(StringField())
runtime = IntField()
imdb = StringField()
summary = StringField()
timestamp = LongField()
year = StringField()
_id = ObjectIdField(primary_key=True)
class User(Document):
_id = ObjectIdField(primary_key=True)
phone = StringField()
name = StringField()
pwd = StringField()
emb = ListField(FloatField())
history = ListField(DictField())
question = IntField()
urls.py
添加url
urlpatterns = [
path('api/question', view=views.question),
]
view.py
用户在前端选择后,将相应数据加入cookies传给后端,后端通过分析cookies中是否含有相关已选信息,来判断推荐到达了哪一步。
每一步中都根据用户的已选项通过MongoDB的聚合操作,选出当前步骤需要推荐的频数较高的选项,并返回前端
最后一步用户选择偏好电影后,将电影id和用户信息传入推荐系统,获得推荐结果,返回给前端
@api_view(['GET'])
def question(request):
cookies=request.COOKIES
if "country" not in cookies:
pipeline=[{"$unwind":"$country"},
{"$group":{"_id":"$country","count":{"$sum":1}}},
{"$sort":{"count":-1}}]
result=list(Movie._get_collection().aggregate(pipeline))[:12]
return JsonResponse({'result': result}, json_dumps_params={'ensure_ascii': False})
if "types" not in cookies:
country=urllib.parse.unquote(cookies['country']).split(",")
pipeline = [{"$match":{"country":{"$in":country}}},
{"$unwind": "$types"},
{"$group": {"_id": "$types", "count": {"$sum": 1}}},
{"$sort": {"count": -1}}]
result = list(Movie._get_collection().aggregate(pipeline))[:12]
return JsonResponse({'result': result}, json_dumps_params={'ensure_ascii': False})
if "stars" not in cookies:
country=urllib.parse.unquote(cookies['country']).split(",")
types = urllib.parse.unquote(cookies['types']).split(",")
pipeline = [{"$match": {"country": {"$in": country},"types":{"$in": types}}},
{"$unwind": "$stars"},
{"$group": {"_id": "$stars", "count": {"$sum": 1}}},
{"$sort": {"count": -1}}]
result = list(Movie._get_collection().aggregate(pipeline))[:12]
return JsonResponse({'result': result}, json_dumps_params={'ensure_ascii': False})
if "movies" not in cookies:
country=urllib.parse.unquote(cookies['country']).split(",")
types = urllib.parse.unquote(cookies['types']).split(",")
stars = urllib.parse.unquote(cookies['stars']).split(",")
filters = {}
filters['country__in'] = country
filters['types__in'] = types
filters['stars__in'] = stars
result = Movie.objects.exclude('_id').filter(**filters)
result = result.order_by("-source__douban__rating").limit(12)
return JsonResponse({'result': json.loads(result.to_json())}, json_dumps_params={'ensure_ascii': False})
movieIds=urllib.parse.unquote(cookies['movies']).split(",")
for i in range(len(movieIds)):
movieIds[i] = int(movieIds[i])
_id=cookies['_id']
user = User.objects.with_id(_id)
if "question" not in user:
items=views.init_emb(movieIds, _id)
user.question=1
elif user.question==0:
items=views.init_emb(movieIds, _id)
user.question = 1
else:
items=views.init_emb(movieIds, _id, False)
User.objects.filter(_id=ObjectId(_id)).update_one(question=user.question)
return JsonResponse({'success': True,'result':items})