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