【创新实训】 后端开发记录(2):电影详情后台

    技术2022-07-10  110

    需求

    RESTful API风格 GET 传入id 返回id对应的电影信息,该电影的相关评论,并将该电影加入用户的历史记录中

    models.py

    用了Movie,Comments,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 Comments(Document): _id = ObjectIdField() movieId=StringField() user=StringField() userId=StringField() rating=StringField() content=StringField() time=StringField() 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/movie/<int:id>/', view=views.movie), ]

    views.py

    通过电影的id从movie集合中查找电影,从comments集合中查找电影的评论,并将评论加入电影的字典中,如果存在登录用户,从cookie中取出用户_id,查找用户并将电影id和访问时间存入用户的history,实现history的去重、排序,将旧记录去除以维护history长度为20

    @api_view(['GET']) def movie(request, id): movie = Movie.objects.exclude('_id').filter(movieId=id).first() if movie is None: return JsonResponse({'data': None, 'msg': '不存在该电影'}, json_dumps_params={'ensure_ascii': False}) movie = movie.to_mongo() if int(datetime.datetime.now()+datetime.timedelta(days=-2))>movie['timestamp']: data = craviews.updateFromDouban(movie['source']['douban']['sourceId']) for key in ["cover", "rating", "rateNum"]: if key in data: movie['source']['douban'][key] = data[key] Movie.objects.filter(movieId=movie['movieId']).update_one(source=movie['source'], timestamp=data['timestamp']) movie['comments']=[] if "mtime" in movie['source']: comments = Comments.objects.exclude('_id').filter(movieId=id) movie['comments'] = json.loads(comments.to_json()) if comments else [] if '_id' in request.COOKIES: _id = request.COOKIES['_id'] user = User.objects.with_id(_id) if user: if 'history' not in user: user.history = [] flag = True for history in user.history: if history['id'] == id: history['timestamp'] = int(time.time()) flag = False if flag: user.history.append({'id': id, 'timestamp': int(time.time())}) user.history.sort(key=historySortOrder, reverse=True) if len(user.history) > 19: user.history.pop() User.objects.filter(_id=ObjectId(_id)).update_one(history=user.history) request.session.set_expiry(3600) request.session.setdefault('sess', []) request.session['sess'] += [id] resp = JsonResponse({'data': movie}, json_dumps_params={'ensure_ascii': False}) return resp

    history数据库实例

    Processed: 0.010, SQL: 9