全网第一篇系列讲述Django线上项目实战的文章。bash
上一篇咱们主要完成了Settings文件的拆分,用以应对不一样的开发环境,运行不一样的配置文件。那么这一节,咱们就要来讲一下剩下的一些API的编写,主要有这么几个:服务器
这个API主要说的是搜索。微信
这个API主要是目前peekhub的一个板块,经过中文,日语平假名和日语片假名来搜索单词:app
看到,点击提交搜索
就可以查询单词,这个实际上是一个form
的POST
提交。在后台那边,处理起来很简单。可是在我们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
的就返回。同时,最后还用levelNum
和classNum
来作升序排列;若是要降序排列,则只须要在className
前面加个负号
就能够,变成-className
。网站
CL是啥,我也不知道,可是我知道这个API主要功能是:ui
其实这几个功能仍是很简单的。spa
这个只须要经过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.visitor
的Q
来作处理;最后一步,搜索。
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,这个其实没啥好说的,很简单,就是取特定日期的地震信息,或者去最近三天的地震信息。
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
循环来作搜索条件的或
。
好了,系列文章今天这一章节就先说到这里,下一节,咱们回来讲一下Django的王牌重头戏:model的操做。
正好立刻就要双11了,又到了一年一度买服务器的时候了。照目前的趋势,皮爷今年确定又会购买服务器了,服务器是真的不嫌多啊,一台服务器能够写网站,两台服务器就能够玩 RPC,三台能够搞集群。。。
喜欢的同窗,能够把皮爷的文章分享出来,让跟多的人一块儿来学习。这个系列教程的文章,皮爷都会讲源代码放到 GitHub 上,想要获取代码的同窗,请关注微信公众号『皮爷撸码』,而后回复『网站代码』便可得到连接地址。这里有更多更好玩的东西,等你一块儿来学习提升。