1. 程式人生 > >Django+mongodb實現Rest_framework

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資料格式有問題,或者是我匯入資料時候格式設定不對,導致匯入資料庫中資料有一點問題。後續進行調整