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

需求

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数据库实例

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值