零基礎教你玩轉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 上,想要獲取代碼的同窗,請關注微信公衆號『皮爺擼碼』,而後回覆『網站代碼』便可得到連接地址。這裏有更多更好玩的東西,等你一塊兒來學習提升。


相關文章
相關標籤/搜索