在我之前写的一篇博客中,我们利用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_mongoengine。打开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数据格式有问题,或者是我导入数据时候格式设置不对,导致导入数据库中数据有一点问题。后续进行调整