框架
后端采用Django编写
Django配置参考
【创新实训】后端开发笔记
需求
/api/search
GET params:
name: 电影名筛选,
rate_min: 最低评分,≥0筛去没有评分的电影,
rate_max: 最高评分,为10即不限制,
time_min: 最早上映时间,
time_max: 最近上映时间,
directors: 导演,仅支持单个,查询列表是否包含,
stars: 演员,仅支持单个,查询列表是否包含,
types:电影类型,
writers:编剧,仅支持单个,查询列表是否包含,
country:国家,仅支持单个,查询列表是否包含,
language:语言,仅支持单个,查询列表是否包含,
limit:每页最大显示数目
offset
models.py
添加Movie的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)
views.py
params接收前端传回的参数,并配置filters,在movie中进行搜索,将搜索结果排序并分页后传给前端
from .models import Details
@api_view(['GET'])
def search(request):
limit = 10 # max_num per page
params = request.GET.dict()
filters = {}
if 'limit' in params:
limit = int(params['limit'])
limit = min(30, limit)
if params.get('name'):
filters['name__contains'] = params['name']
for key in ['types', 'stars', 'directors', 'writers', 'country', 'language']:
if params.get(key):
filters[key] = params[key]
if params.get("time_min"):
filters['year'] = {"$gt": str(max(int(params['time_min']), 0))}
if params.get("time_max"):
filters['year'] = {"$lt": str(int(params['time_max']) + 1)}
if 'rate_min' in params:
filters['source__douban__rating__gte'] = params['rate_min']
filters['source__mtime__rating__gte'] = params['rate_min']
filters['source__maoyan__rating__gte'] = params['rate_min']
if 'rate_max' in params and params['rate_max'] != "10":
filters['source__douban__rating__lte'] = params['rate_max']
filters['source__mtime__rating__lte'] = params['rate_max']
filters['source__maoyan__rating__lte'] = params['rate_max']
if 'insertStamp' in params:
filters['insertStamp'] = params['insertStamp']
offset = int(request.GET.get('offset', 0))
movies = Movie.objects.exclude('_id').filter(**filters)
total = movies.count()
movies = movies.order_by("-year","-source__douban__rating")
movies = movies.limit(limit).skip(offset)
return JsonResponse({'data': json.loads(movies.to_json()), 'total': total},
json_dumps_params={'ensure_ascii': False})
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
url('api/search', view=views.search),
]