零基础教你玩转Django之05篇 —— 剩余搜索,检索API编写

全网第一篇系列讲述Django线上项目实战的文章。bash

上一篇咱们主要完成了Settings文件的拆分,用以应对不一样的开发环境,运行不一样的配置文件。那么这一节,咱们就要来讲一下剩下的一些API的编写,主要有这么几个:服务器

  • 日语单词搜索API
  • CL 列表API
  • 日本地震列表搜索API

日语单词API

这个API主要说的是搜索。微信

这个API主要是目前peekhub的一个板块,经过中文,日语平假名和日语片假名来搜索单词:app

看到,点击提交搜索就可以查询单词,这个实际上是一个formPOST提交。在后台那边,处理起来很简单。可是在我们PeekpaHub里面,咱们先写成get请求:函数

def get(self, request):        response = {'code': 200}        search_type, search_key = self.process_paramter(request)        print('search_type: ', search_type)        result = None        if search_type == 1:            result = JapLanguage.objects.filter(chinese__contains=search_key).all().order_by('levelNum').order_by('classNum')        elif search_type == 2:            result = JapLanguage.objects.filter(jp_chinese__contains=search_key).all().order_by('levelNum').order_by('classNum')        elif search_type == 3:            result = JapLanguage.objects.filter(jp_only__contains=search_key).all().order_by('levelNum').order_by('classNum')        response['search_word'] = search_key        response['size'] = 0 if result is None else len(result)        response['data'] = JapSerializer(result, many=True).data        return Response(data=response, status=200)    def process_paramter(self, request):        if request.GET.get('chinese') is not None:            return 1, request.GET.get('chinese')        elif request.GET.get('jp_ch') is not None:            return 2, request.GET.get('jp_ch')        elif request.GET.get('jp_only') is not None:            return 3, request.GET.get('jp_only')        else:            return 0, None复制代码

这里面使用到了Megic Number,这个其实应该规避一下。啥是Magic Number?其实就是代码里面,若是有用数字表示的地方,最好使用一个变量名来代替它。在这里,数字表示的就是搜索的三种type,1,2,3.因此,最好仍是用好比TYPE_SEARCH_CHINESE=1这样的命名规则来让1,2,3可以读懂。post

还有一点,就是搜索语句:学习

result = JapLanguage.objects.filter(chinese__contains=search_key).all().order_by('levelNum').order_by('classNum')复制代码

这里的filter()函数里面,用到了__contains字段,这个表示在chinese这个变量名下面的内容,若是包含了search_key的就返回。同时,最后还用levelNumclassNum来作升序排列;若是要降序排列,则只须要在className前面加个负号就能够,变成-className网站

重头戏,CL的API

CL是啥,我也不知道,可是我知道这个API主要功能是:ui

  • 经过传入不一样的板块ID,来展现不一样板块的内容;
  • 经过传入日期,来展现不一样日期的内容;
  • 经过传入关键字,来在不一样板块实现搜索功能。

其实这几个功能仍是很简单的。spa

传不一样ID展现不一样板块:

这个只须要经过ID值,来选取不一样的Model就能够。

if fid == self.FID_2:    result = CaoliuFid2.objects.filter(post_day_time=day).order_by('-post_time').all()elif fid == self.FID_4:    result = CaoliuFid4.objects.filter(post_day_time=day).order_by('-post_time').all()复制代码

好比这里,若是传入的是2,那么就选择CaoliuFid2来作相对于的数据操做;若是是4,则选择CaoliuFid4。

传入日期显示那天的数据:

这个代码其实和上面的代码同样。看到上面有:

result = CaoliuFid2.objects.filter(post_day_time=day).order_by('-post_time').all()复制代码

filter()方法里面,传入的就是日期做为关键搜索来处理的。

关键字搜索

这个仍是,第一步就是经过传入板块ID来寻找对应板块的Model;第二步就是传入关键字,由于有些时候关键字可能有大小写之分,这里用 mongoengine.queryset.visitorQ 来作处理;最后一步,搜索。

if handle_type == self.TYPE_SEARCH:    query_set = Q(post_title__contains=search_key) | Q(post_title__contains=search_key.upper()) | Q(post_title__contains=search_key.lower())    if fid == self.FID_2:        result = CaoliuFid2.objects(query_set).order_by('-post_time').all()    elif fid == self.FID_4:        result = CaoliuFid4.objects(query_set).order_by('-post_time').all()复制代码

这里的query_set里面用到了Q,他的做用就是将这几个query_set的条件起来。
最后结果是这样:

日本地震信息API

基于以上两个板块的API,这个其实没啥好说的,很简单,就是取特定日期的地震信息,或者去最近三天的地震信息。

def get(self, request):    response = {'code': 200}    days = int(request.GET.get('days', 3))    response['days'] = days    now = datetime.datetime.now()    time_day_one = now.strftime('%Y-%m-%d')    query_set = Q(jp_time_num__startswith=time_day_one)    for i in range(days):        before_day = (now + datetime.timedelta(days=-i)).strftime('%Y-%m-%d')        query_set = Q(jp_time_num__startswith=before_day) | query_set    result = JpEarthQuake.objects(query_set).order_by('-jp_id').all()    jp_serialiazer = JpEarthSerializer(result, many=True)    response['data'] = jp_serialiazer.data    return Response(data=response, status=200)复制代码

这里的关键就在于,有一个能够查看天数的条件,这里经过一个for循环来作搜索条件的

To be continue

好了,系列文章今天这一章节就先说到这里,下一节,咱们回来讲一下Django的王牌重头戏:model的操做。

正好立刻就要双11了,又到了一年一度买服务器的时候了。照目前的趋势,皮爷今年确定又会购买服务器了,服务器是真的不嫌多啊,一台服务器能够写网站,两台服务器就能够玩 RPC,三台能够搞集群。。。

喜欢的同窗,能够把皮爷的文章分享出来,让跟多的人一块儿来学习。这个系列教程的文章,皮爷都会讲源代码放到 GitHub 上,想要获取代码的同窗,请关注微信公众号『皮爷撸码』,而后回复『网站代码』便可得到连接地址。这里有更多更好玩的东西,等你一块儿来学习提升。


相关文章
相关标签/搜索