暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

接口测试与开发实战(九)_DRF 序列化器(1)

388

序列化器


定义序列化器(本质就是一个类),一般包括模型类的字段,有自己的字段类型规则。实现了序列化器后,就可以创建序列化对象以及查询集进行序列化操作,通过序列化对象.data来获取数据(不用自己构造字典,再返回Json数据)


1.用于序列化时,将模型类对象传入instance参数


2.用于反序列化时,将要被反序列化的数据传入data参数


3.除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据


drf中的序列化器是比较多的、这里就讲解二个比较通用的、基础的序列化器


from rest_framework import serializers
#导入restframework 中的序列化类 serializers

serializers.Serializer #基础序列化类

serializers.ModelSerializer #模型序列化类

复制


进行使用Serializer


第一步进行创建序列化模块、我们在项目中创建一个common文件夹用于存放公共的组件及配置等。


第二步在common创建一个名为SerializersCommon.py文件


第三步直接上代码了、我们弄一个查询user表的序列化器


from rest_framework import serializers
#导入restframework 中的序列化类 serializers
class MyUserInfoSerializerAll(serializers.Serializer):
    """
    获取用户信息序列化
    """

    
    id = serializers.CharField()
    username = serializers.CharField()
    nickname = serializers.CharField()
    phone = serializers.CharField()

复制


上面定义的字段名称 id、username等是需要与User表字段名一致否则在进行请求时序列化时会找不到指定字段就会抛出异常。



这些字段就是要进行序列化传递出去的数据结构


接下来我们写一个获取用户信息的接口:


from common.SerializersCommon import MyUserInfoSerializerAll
# 导入定义的序列化
class GetUserInfo(APIView):
    renderer_classes = [JSONRenderer] #进行前端渲染的是json,如果不设置浏览器会启动默认的drf调试模板

    # 查询数据的话就用get请求即可
    def get(self,request):
        data = User.objects.all()
        # 查询User所有数据 对应的SQL为 select * from User

        redata = MyUserInfoSerializerAll(data,many=True)
        # data 为查询出来的数据,many=True 时传入的参数需要包含多个对象

        context = {
            "code":0,#数据状态码、开发自己定义的
            "data":redata.data,#数据载体,所有数据通过该字段进行传递、可以自行设置
            "messageCode":1000#定义的提示信息码
        }


        return Response(context)
        #     Response方法会自动进行将Python字典类型数据进行序列化、变成一个json类型

复制


接口正常了为什么data为空列表呢?其实是我们的数据库里没有数据。




那我们再来写个添加用户的接口吧?


post方法用于创建新数据、所以我们定义一个post方法接口、这个接口需要接收到用户的参数所以我们使用以下二种方式进行获取post请求的参数


# 接收请求过来的数据、二种方式
# 1、formdata格式
name = request.POST.get("name")
username = request.POST.get("username")
phone = request.POST.get("phone")
password = request.POST.get("password")

# 2、直接接收json格式、接收过来的是反序列化过的字典类型  
request_data = request.data  

复制


我们演示下这二种的效果如何、打开你的postman


定义好接口


# 导入定义的序列化
class CreateUser(APIView):
    renderer_classes = [JSONRenderer] #进行前端渲染的是json,如果不设置浏览器会启动默认的drf调试模板

 
    def post(self,request):
        """
        添加用户
        :param request:
        :return:
        """

        # 接收请求过来的数据、二种方式
        # 1、formdata格式
        name = request.POST.get("name")
        username = request.POST.get("username")
        phone = request.POST.get("phone")
        password = request.POST.get("password")

        print(name,username,phone,password)

        context = {
            "code":0,#数据状态码、开发自己定义的
            "data":[name,username,phone,password],#数据载体,所有数据通过该字段进行传递、可以自行设置
            "messageCode":1000#定义的提示信息码
        }


        return Response(context)
        #     Response方法会自动进行将Python字典类型数据进行序列化、变成一个json类型 

复制


url映射


urlpatterns = [
    path('admin/', admin.site.urls), #后台系统的url地址一般生产都会进行修改该路径为了安全起见
    path('test/', test_list),#直接输入对应的方法名称、无需带括号
    path('test/<name>/', test_case),
    path('auth/', include('rest_framework.urls')),
    path('api/test', ListUser.as_view(),name="测试接口"), #进行映射API视图关系
    path('api/create/book', CreateArticle.as_view(),name="创建文章"),
    path('api/user/list', GetUserInfo.as_view(),name="查询用户信息"),
    
    path('api/user/create', CreateUser.as_view(),name="创建用户"),                            
]

复制


没有任何参数直接发送请求、成功了证明接口ok






开始传递参数、数据接收到了证明该方法可行的、接下来看看第二种方法。



第二种方法 formdata


# 导入定义的序列化
class CreateUser(APIView):
    renderer_classes = [JSONRenderer] #进行前端渲染的是json,如果不设置浏览器会启动默认的drf调试模板


    def post(self,request):
        """
        添加用户
        :param request:
        :return:
        """


        # 2、直接接收json格式、接收过来的是反序列化过的字典类型
        request_data = request.data


        context = {
            "code":0,#数据状态码、开发自己定义的
            "data":request_data,#数据载体,所有数据通过该字段进行传递、可以自行设置
            "messageCode":1000#定义的提示信息码
        }


        return Response(context)
        #     Response方法会自动进行将Python字典类型数据进行序列化、变成一个json类型

复制





第二种 raw json






好既然都能接收到参数我们就开始正式写增删改查操作了。


首先是增、添加用户接口


class CreateUser(APIView):
    renderer_classes = [JSONRenderer] #进行前端渲染的是json,如果不设置浏览器会启动默认的drf调试模板

    def post(self,request):
        """
        添加用户
        :param request:
        :return:
        """


        # 直接接收json格式、接收过来的是反序列化过的字典类型
        request_data = request.data

        # 定义序列化容器
        context = {}

        # 传入的参数不能为空
        if  request_data is not None:
            # 进行查重操作、不能存在相同的用户名存在、如果添加的用户名已存在
            if User.objects.filter(username=request_data["username"]):
                context["code"] = 1
                context["message"] = "%s 该用户已存在"%request_data["username"]
                context["messageCode"] = 4002
                return Response(context)

            else:
                # 向数据库中添加数据
                User.objects.create(
                    username=request_data["username"],
                    password=request_data["password"],
                    phone=request_data["phone"],
                    nickname=request_data["name"]
                )
                context["code"] = 0
                context["message"] = "创建成功"
                context["messageCode"] = 4000
                return Response(context)

        else:
            context["code"] = 1
            context["message"] = "参数不能为空"
            context["messageCode"] = 4001
            return Response(context)

复制


创建成功





再次请求、证明接口达到我们的需求。




我们之前是创建了一个 文章表、我们来进行使用刚刚创建的用户进行给他创建一篇文章、这里就涉及了关联表了,首先我们定义好接口:


1、要考虑接收什么数据


2、进行关联表创建数据


既然这个接口的功能是为了创建一个文章、且文章是需要用户登录进行发布的。我们是否可以进行传入一个用户id给后端接口然后端知道该文章是谁发布的。


然后就是需要传递 文章标题、和文章内容了


那么这个接口是这样的


请求参数为


id、title、content三个参数、其实在真实的业务中id是被token所取代的。我们就做演示在后续接口开发再去做这方面的东西。



# 导入定义的序列化
class CreateArticle(APIView):
    renderer_classes = [JSONRenderer] #进行前端渲染的是json,如果不设置浏览器会启动默认的drf调试模板

    def post(self,request):
        """
        添加文章
        :param request:
        :return:
        """


        # 直接接收json格式、接收过来的是反序列化过的字典类型
        request_data = request.data

        # 定义序列化容器
        context = {}

        # 传入的参数不能为空
        if  request_data is not None:
            # 进行判断该用户是否存在
            if User.objects.filter(id=request_data["id"]):
                Article.objects.create(
                    title=request_data["title"],
                    content=request_data["content"],
                    author_id=request_data["id"],
                )
                context["code"] = 0
                context["message"] = "创建成功"
                context["messageCode"] = 4000
            else:
                context["code"] = 1
                context["message"] = "%s 该用户不存在"
                context["messageCode"] = 4004

        else:
            context["code"] = 1
            context["message"] = "参数不能为空"
            context["messageCode"] = 4001

        return Response(context)

复制



好了这些接口基本都已经可以了接下来就是正式来看看序列化器了。




拒绝白嫖,不给钱就点赞分享、关注、在看吧!!!关注公众号更多精彩教学分享尽在公众号中!!!

文章转载自测试前沿布道者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论