前言
上一篇文章我简单说了一下数据库的创建和使用,简单的写了一个登录页面,也实现了数据的存储功能,当然这样说肯定不够的,既然能存,那肯定也要能读,不然我要它何用对吧。这篇文章我就说一下怎么读取存入的数据,以及将数据序列化成JSON格式的数据返回,并提供接口让前端/移动端调用。
一:了解
抛开那些专业的词汇,简单来说我的理解就序列化就是把数据库或者内存的数据通过某个方法转换成json这个过程就称之为序列化,而反序列化刚好相反,就是把json数据通过某个方法(转换模型)转换成可以存储在数据库中的数据,则称之为反序列化。描述可能不太准确,但是这样更容易记忆,也是我的个人理解。这篇文章很浅显,如果非要较真,序列化还是比较大的课题,个人能力有限,还请另查资料
二:使用
我就不回顾前面的内容了,有问题的可以直接看前面的文章,跟着步骤一步一步做下来应该都能成功。
既然数据存储了,那么我们就要使用,不然就是废数据,浪费空间和资源。上一篇文章我们存了两条数据,字段是登录都用户名和密码。那么我们首先看看如何调用。
其实调用也很简单,我们先修改view.py中都内容。为了便于理解,我新写了一个方法,取名为get_data,语句很简单
vive.py
def get_data(request):
data = UserInfo.objects.all()
print(data)
return HttpResponse(data)
运行后发现,数据出来了但是不是我们要都结果那要怎么才能变成正常都json数据呢?写过Python的都知道,Python是有一个json库的,用来转换json数据,我们姑且试下,是否可以使用json转换,修改代码
view.py
import json
def get_data(request):
data = UserInfo.objects.all()
print(json.dumps(json))
return HttpResponse(json.dumps(json))
但是运行后我们发现报错了,json是不能直接将数据模型转换为json数据的, 那怎么才能将数据转换为正常的json数据呢?其实也很简单,python语言已经为我们想好了,只需要使用serializers就可以一行代码实现序列化。继续修改我们的view.py文件,引用
from django.core import serializers
转化数据
data = serializers.serialize("json",UserInfo.objects.all())
运行程序
到这里其实我们的序列化目的已经完成了,model是数据库名称,pk是数据的主键,但是这种数据好像并不是我们需要的数据,而我们只需要fields中的数据就可以了,而其他的数据完全可以舍弃,而且也不必要让前端或者移动端看到,但是要怎么去获取fields的数据呢?
其实也很简单,使用DjagoRESTframework就可以做到,根据官网步骤,首先集成REST
然后修改sttings.py文件,在INSTALLED_APPS里增加rest_framework引用
在在demo文件下新建一个userinfo_serializer文件,然后编写代码
userinfo_serializer.py
from demo.models import UserInfo
from rest_framework import serializers
class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo
fields = ("id", "usrename", "password")
这里我展示了id,usrename,password三个字段,这里说明一下,model和fields字段都是固定的,这个不能改变,只能这么写,反正我这里改变就报错,读者也可以试下改改看
然后增加UserInfoSet类去做模型转换处理,这里queryset和serializer_class也是固定写法,改变也会报错
view.py
from demo.userinfo_serializer import UserInfoSerializer
from rest_framework import viewsets
class UserInfoSet(viewsets.ModelViewSet):
queryset = UserInfo.objects.all()
serializer_class = UserInfoSerializer
最后就是编写我们的路由,这里的路由和原来的不太一样,文档说是最好新建一个url类,然后编写,我这里嫌麻烦就直接写在项目的路由下了,只是为了做案例讲解,不太建议按着我这样写
urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from demo import views
from rest_framework import routers
# 定义路由地址
route = routers.DefaultRouter()
# 注册新的路由地址
route.register(r'getuser', views.UserInfoSet)
urlpatterns = [
path('admin/', admin.site.urls),
# path('index2',views.index2),#
url(r'^index$', views.index), # 和path路由效果是一样的
url(r'index2', views.index2),
url(r'^login$', views.login),
url(r'^getdata',views.get_data),
url(r'^', include(route.urls)),
]
最后运行
我这里设定了显示id,username(创建数据时写错了,这里表示username,不影响阅读)和password,所以这里显示了这个三个字段,你也可以尝试显示两个或者一个,这个随意。当然了,这里是显示所有数据,那么显示一条数据改怎么写呢,在读取数据的时候添加判断。我这里添加了只读取id=1的数据,
queryset = UserInfo.objects.filter(id=1)
三:总结
这篇文章很基础,毕竟自己也是初学者,有很多讲的不是很到位,也不是很明确,还是希望大家多翻资料吧。共同进步
Github地址(demo和commit同步)