django-API-restframework(入门篇)


发布时间:2019-02-28 05:41    作者: 晖哥哥   已过去:2 年,9 月   阅读总量:1447 已被赞:2


rest_framework 环境配置:

1.安装:

pip install djangorestframework

2.注册:

INSTALLED_APPS = [
   # ....
   'rest_framework',
   # ....
]

创建 rest 的 Serializers 类:

1.在项目APP下,新建一个serializations.py 这就好比我们的表单验证一样,我们在APP下新建一个forms.py,对表单进行验证,序列化也是同样的思路。

2.serializations.py 里我们这样:

引入:

from rest_framework import serializers #导入这个类
from .models import Post #导入需要序列化的模型
创建Serializers 类:

创建一个类,并继承他的serializers.ModelSerializer这个基类,好比我们继承表单验证的的forms.Modelform,是一样的操作
class PostreadSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post #需要将哪个模型序列化
        #需要提取的字段
        #fields = ('uid', 'title', 'context', 'author', 'tag', 'put_in_time','up_to_date','img','vote')
        #提取全部的字段就这样
        fields = '__all__'
3.新建处理视图,在views.py里,我们这样:

导入:

from .serializations import PostreadSerializer #导入做的序列化类
from django.http import JsonResponse
新建视图:

#API功能实验函数
def ydrs(request,post_id):
    #需要一个Quer对象才能序列化所以用filter方法
    posts = Post.objects.filter(pk=post_id)
    #将获取的数据交给序列号处理
    serializer= PostreadSerializer(posts,many=True) #many=True 表示要将传进来的全部内容都序列号
    #通过data方法获取结果
    data = serializer.data
    #增加safe = false,使其接受列表。
    return JsonResponse(data,safe=False)
新建链接路由:

path('time/<post_id>/',ydrs), #文章详情页路由
如果模型中有一对多,多对多外键关联字段,就要单独序列化外键模型,才会显示出具体的内容

#在上面的PostreadSerializer中,有外键字段需要显示为具体内容
#就需要单独再定义一个序列化处理,不然就只显示外键ID
#如 tag  就显示为1,不会是他具体的名字 django2.0
class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields =('id','name')

#作者序列化(可以集中在一起序列化,也可以不听APP各自,再导入来使用)
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields =('uid','username')
这两个类要写在PostreadSerializer类的上方。

PostreadSerializer类这样修改:

class PostreadSerializer(serializers.ModelSerializer):
    tag = TagSerializer() #将Tag序列化给tag,这样拿到的‘tag’字段就单是一个ID, 也有具体内容
    author = UserSerializer()
    class Meta:
        model = Post #需要将那个模型序列化
        #需要提取的字段
        #fields = ('uid', 'title', 'context', 'author', 'tag', 'put_in_time','up_to_date','img','vote')
        fields = '__all__'
视图函数可以修改一下 :

#API功能实验函数
def ydrs(request,post_id):
    #需要一个Quer对象才能序列化所以用filter方法
    posts = Post.objects.filter(pk=post_id)
    #将获取的数据交给序列号处理
    serializer= PostreadSerializer(posts,many=True) #many=True 表示要将传进来的全部内容都序列号
    #通过data方法获取结果
    data = serializer.data
    return HttpResponse(data)
我们来了解一下关于 Serializer 的常用操作,这边列出一些常用的功能,可以实际码下看看,效果会比看一遍要好

from .models import Post
from .serializers import PostSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from django.utils.six import BytesIO
import datetime

# 创建数据(参考 django model 部分)
post = Post(title='Restful 接口入门', create_time=datetime.datetime.now(),
           modified_time=datetime.datetime.now(), body='Restful 接口入门',
           excerpt='Restful 接口入门')
# 保存到数据库
post.save()
# 对 post 实例进行序列化
serializer = PostSerializer(post)
# 通过 serializer.data 查看序列化后的结果,是一个字典
# {'title': 'Restful 接口入门', 'body': 'Restful 接口入门', 
# 'create_time': '2018-04-05T21:27:21+08:00', 'modified_time': '2018-04-05T21:27:25+08:00', 
# 'excerpt': 'Restful 接口入门'}
print(serializer.data)

# 通过 JSONRenderer 将序列化的数据渲染成 json 格式的数据
content = JSONRenderer().render(serializer.data)
# b'{"title":"Restful 接口入门","body":"Restful 接口入门",
# "create_time":"2018-04-05T21:27:21+08:00",
# "modified_time":"2018-04-05T21:27:25+08:00","excerpt":"Restful 接口入门"}'
print(content)

# 如果将 json 转回字典,需要通过 BytesIO 进行处理
stream = BytesIO(content)
# 打印结果同序列化后的结果
data = JSONParser().parser(stream)

# 将数据转换成为实体类对象
serializer = PostSerializer(data=data)
# 需要检验是否有效数据,类似 Form
serializer.is_valid()
# 经过验证后的数据,返回一个 OrderedDict
# OrderedDict([('title', 'Restful 接口入门'), ('body', 'Restful 接口入门'),
# ('create_time', datetime.datetime(2018, 4, 5, 21, 27, 21,
# tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)), 
# ('modified_time', datetime.datetime(2018, 4, 5, 21, 27, 25,
# tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)), 
# ('excerpt', 'Restful 接口入门')])
print(serializer.validated_data)
# 保存有效的数据,通常用于 POST 提交的数据信息
serializer.save()

# 除了序列化模型实例,也可以将 queryset 进行序列化,此时需要在 serializer 中加入 many=True
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
# 返回 OrderedDict 列表
print(serializer.data)

 

点赞

2




登陆后方可评论