Django+mongodb實現Rest_framework
在我之前寫的一篇部落格中,我們利用Django已經將.csv匯入到mongodb資料庫中,那麼現在我們想利用這些資料設計一些API,利用url進行互動,已達到與前端對接的程度。在這裡呢,我想使用Rest_framework來實現一個初步的API介面。由於我們使用的是MongoDB資料庫,不是Django所主流支援的資料庫,所以我們在使用Rest_framework的時候會有所不同。
首先說明一下python及Django版本:
python3.6 django2.0.6
接下來是我們會用到的一些元件:
pip install mongoengine
pip install djangorestframework
pip install django-rest-framework-mongoengine==3.3.1
接下來是建立專案及APP,我建立的APP名為 datas,因為我事先已經建立好了,在這裡就不重複。貼一下建立程式碼:
python manage.py startproject vis
python manage.py startapp datas
建立好Django專案後,首先我們開啟專案檔案下setting.py,在INSTALLED_APPS中加入以下內容:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'rest_framework_mongoengine', 'datas', #你的app名 ]
還是在setting.py中,在DATABASES這裡改為如下:
DATABASES = {
'default': {
'ENGINE': None,
}
}
from mongoengine import connect
connect('vis') #所使用的mongodb庫名
mongoengine提供的connect函式可以方便的連線到mongodb資料庫。
接著我們要建立模型,開啟data/models.py,新增以下程式碼:
from __future__ import unicode_literals from django.db import models from mongoengine import * # Create your models here. connect('vis',host = '127.0.0.1',port = 27017) class data1(Document): siteid = IntField(max_length=45) title = StringField(max_length=45) lng = StringField(max_length=45) lat = StringField(max_length=45) # 指明連線的資料表名 meta = {'collection':'raw_data1'} def __unicode__(self): return self.name class data2(Document): personid = StringField(primary_key=True) siteid = StringField(max_length=45) xb = StringField(max_length=45) customername = StringField(max_length=45) onlinetime = StringField(max_length=45) offlinetime = StringField(max_length=45) areaid = StringField(max_length=45) birthday = StringField(max_length=45) # 指明連線的資料表名 meta = {'collection':'raw_data2'} def __unicode__(self): return self.name # 測試是否連線成功 #for i in data1.objects[:10]: # print(i.title)
在這裡由於我準備了兩個表,所以我定義了兩個models。(但測試結果時只用到了一個表的資料)
注意我們在這裡使用的是mongoengine的函式,與直接使用rest_framework定義model的方式不一樣,例如models改為了Document。定義資料型別的CharField改為了StringField。其他定義可以自行查詢mongoengine。
接下來是序列化的部分,這裡我們定義序列化也需要稍作變化,使用rest_framework_mongoengine.serializers。在datas目錄下建立serializers.py,加入以下程式碼:
from rest_framework_mongoengine import serializers
from . import models
class data1Serializer(serializers.DocumentSerializer):
class Meta:
model = models.data1
fields = '__all__' #這個是將所有的欄位都序列化
class data2Serializer(serializers.DocumentSerializer):
class Meta:
model = models.data2
fields = '__all__' #這個是將所有的欄位都序列化
接下來是views.py,同理,我們也需要用到rest_framework_mongoengin。開啟view.py,加入以下程式碼:
from . import models
from . import serializers
from rest_framework_mongoengine import generics
class ListView(generics.ListCreateAPIView):
queryset = models.data1.objects.all()
serializer_class = serializers.data1Serializer
到此,我們就利用rest_framework建立了一個簡單的,可用於檢視所有資料的API。接著我們需要在urls.py中進行設定,以便我們使用url進行訪問。
首先在專案檔案下的urls.py中寫入:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('datas.urls')), #包含app中的urls
]
接著我們進入app檔案,開啟datas/urls.py,寫入:
from django.contrib import admin
from django.urls import path,include
from .views import ListView
urlpatterns = [
path('all/', ListView.as_view(),name='data1')
]
好了,現在所有設定完畢。我們執行一下試試。
首先執行mongodb資料庫,
mongod --dbpath 你的mongodb data檔案目錄
然後執行專案,在專案根目錄下,開啟cmd,輸入一下命令:
python manage.py runserver
執行成功。
接下來開啟瀏覽器,在url中輸入 http://127.0.0.1:8000/api/all
成功。
PS:在這可能是.csv資料格式有問題,或者是我匯入資料時候格式設定不對,導致匯入資料庫中資料有一點問題。後續進行調整