【创新实训】 后端开发记录(1):电影搜索后台

本文记录了使用Django框架进行后端开发的创新实训,详细介绍了如何实现电影搜索功能,包括API接口`/api/search`的参数设置,如电影名、评分、上映时间等筛选条件,以及models.py、views.py和urls.py的配置过程。
摘要由CSDN通过智能技术生成

框架

后端采用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),
    
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值