需求
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