前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python测试开发django-64.序列化(Serializer)

python测试开发django-64.序列化(Serializer)

作者头像
上海-悠悠
发布2019-09-19 18:19:56
5280
发布2019-09-19 18:19:56
举报

前言

REST framework中的serializers与Django的Form和ModelForm类非常像。我们提供了一个Serializer类,它为你提供了强大的通用方法来控制响应的输出,

以及一个ModelSerializer类,它为创建用于处理模型实例和查询集的序列化程序提供了有用的快捷实现方式。

serializers.Serializer

先从一个简单的案例开始,在apiapp目录下编辑models.py,以创建用户个人信息model为例

代码语言:javascript
复制
# models.py
from django.db import models
# 作者:上海悠悠,QQ交流群:750815713

# Create your models here.
class UserPersonalInfo(models.Model):
    '''用户个人信息'''
    name = models.CharField(max_length=10, verbose_name="昵称")  # 昵称
    sex_choices = (
        (u'M', u'男'),
        (u'F', u'女'),
    )
    sex = models.CharField(max_length=11,
                           choices=sex_choices,
                           verbose_name="性别",
                            )
    age = models.IntegerField(verbose_name="年龄",  default="", blank=True)
    mail = models.EmailField(max_length=30, default="", blank=True)
    create_time = models.DateField(auto_now=True, verbose_name="添加时间")

执行 makemigrations 和migrate同步数据库

python manage.py makemigrations python manage.py migrate

Serializer是rest_framework中最简单的序列化基类,封装也是最低的。但是这个基类比较灵活,可以通过这个类来定制我们需要的序列化类。 实现这个类需要重写两个方法,create和update。

  • create方法对应我们在使用API的时候通过POST来访问的,因为通常通过POST来传递我们需要新建实例的数据。
  • update方法对应通过PUT/PATCH方法访问API,用来新建实例或者更新已存在的实例,这取决于数据库是否存在我们需要操作的实例。

在apiapp目录下新建一个serializersapi.py文件,在该文件先编辑需要序列化的model,id是系统默认自带的一个字段。

代码语言:javascript
复制
│  manage.py
├─apiapp
│  │  admin.py
│  │  apps.py
│  │  auth.py
│  │  models.py
│  │  serializersapi.py
│  │  tests.py
│  │  views.py
│  │  __init__.py
│  │
│  ├─migrations
│  │  │  0001_initial.py
│  │  │  0002_userpersonalinfo.py
│  │  │  __init__.py
│
└─yoyoapi
    │  settings.py
    │  urls.py
    │  wsgi.py
    │  __init__.py

在写序列化类的时候,字段里面的相关参数verbose_name,blank得去掉。

代码语言:javascript
复制
# serializersapi.py
from rest_framework import serializers
from .models import UserPersonalInfo

class UserPersonalInfoSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=10)  # 昵称
    sex_choices = (
        (u'M', u'男'),
        (u'F', u'女'),
    )
    sex = serializers.ChoiceField(choices=sex_choices
                            )
    age = serializers.IntegerField(default="")
    mail = serializers.EmailField(max_length=30, default="")
    create_time = serializers.DateField(read_only=True)

    def create(self,validated_data):
        return UserPersonalInfo.objects.create(**validated_data)

    def update(self,instance,validated_data):
        instance.name=validated_data.get('name',instance.name)
        instance.sex=validated_data.get('sex',instance.sex)
        instance.age=validated_data.get('age',instance.age)
        instance.mail=validated_data.get('mail',instance.mail)
        instance.save()
        return instance

在创建ArticleSerializer的时候,创建了一些字段,这些字段代表Serializer类在序列化的时候和model对应的字段。这些字段应该和model里定义的字段同名。

在定义的时候,指定了一些参数,这里只用了read_only,还有其它的参数

  • write_only,required,allow_null/allow_blank,label,help_text,style,error_messages
  • read_only: 表示该字段只能用于API的输出,用户并不能直接指定该字段的值
  • write_only: 这个就和read_only相反,需要用户指定该字段的值
  • required: 该字段是必需的,不能为空
  • allow_null/allow_blank: 该字段允许为null/空
  • label: 标签,用于对字段显示设置
  • help_text: 对字段进行解释的一段文本,用于提示
  • style: 说明字段的类型
  • error_messages: 字段出错时,信息提示

update方法中instancece参数是一个model实例,也可以是一个自定义类实例,其实model也就是一个类,只是在底层封装了一些ORM操作。

views.py视图

views.py编辑以下内容

代码语言:javascript
复制
# views.py
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import *
from rest_framework.permissions import IsAuthenticated,AllowAny
from .serializersapi import UserPersonalInfoSerializer
# 作者:上海悠悠,QQ交流群:750815713

class UserPersonalInfoView(APIView):
    '''REST framework的APIView实现获取UserPersonalInfo表 # 作者:上海悠悠,QQ交流群:750815713'''
    # authentication_classes = (TokenAuthentication,)  # token认证
    # permission_classes = (IsAuthenticated,)   # IsAuthenticated 仅通过认证的用户
    permission_classes = (AllowAny,)  # 允许所有用户

    def get(self, request, format=None):
        """
        Return a list of all UserPersonalInfo
        """
        info = UserPersonalInfo.objects.all()
        serializer = UserPersonalInfoSerializer(info, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        '''
        create UserPersonalInfo
        '''
        verify_data = UserPersonalInfoSerializer(data=request.data)
        if verify_data.is_valid():
            verify_data.save()
            return Response({"message": "create some data!", "data": request.data})
        else:
            return Response(verify_data.errors)

urls.py设置访问路径

代码语言:javascript
复制
# urls.py
from apiapp import views
from django.conf.urls import url

# 作者:上海悠悠,QQ交流群:750815713

urlpatterns = [
    url(r'^userinfo', views.UserPersonalInfoView.as_view()),
]

测试接口

访问’http://127.0.0.1:8000/userinfo',post请求测试结果

代码语言:javascript
复制
POST http://127.0.0.1:8000/userinfo HTTP/1.1
User-Agent: Fiddler
Host: 127.0.0.1:8000
Content-Length: 82
Content-Type: application/json

{
    "name": "yoyo",
    "sex": "M",
    "age": "20",
    "mail": "283340479@qq.com"
}

新增成功,查看数据库,会生成一条数据

访问’http://127.0.0.1:8000/userinfo',get请求测试结果

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • serializers.Serializer
  • views.py视图
  • 测试接口
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档