DRF序列化器

DRF序列化器

  • 序列化和反序列化介绍
  • 之间用的3种序列化方式
  • DRF序列化器的三种形式
  • DRF序列化器关联表显示
  • 改变序列化和反序列化行为

序列化和反序列化介绍

  • 在日常开发中,会从别的API获取数据或者自己写API提供数据,数据格式一般都是采用JSON格式。这期间就会涉及两个专业术语:
    • **序列化:**将python对象转json

    • **反序列化:**将json转为python对象

      import json

      序列化

      computer = {"主机":5000,"显示器":1000,"鼠标":60,"键盘":150}
      json.dumps(computer)

      反序列化

      json.loads(json_obj)

DJango内置Serializers模块

  • Serializers是django内置的一个序列化器,可以直接将python转化为python对象转化为json的格式,但不支持反序列化。
  • JsonResponse模块自动将Python对象转为JSON对象并响应。

DRF中有一个serializers模块专门负责数据序列化,DRF提供的方案更先进、更高级别的序列化方案。

序列化支持的三种类型

  • **Serializer:**对Model(数据模型)进行序列化,需自定义字段映射

  • **ModelSerializer:**对Model进行序列化,会自动生成字段和验证规则,默认还包含简单的create()和update()方法。

  • **HyperlinkedModelSerializer:**与ModelSerializer类似,只不过使用超链接来表示关系而不是主键ID。

获取所有的用户(查)

  • 定义序列化器

myapp_api/serializers.py

python 复制代码
from rest_framework import serializers

class UserSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField(max_length=100)
    age = serializers.IntegerField()
    city = serializers.CharField(max_length=100)
    sex = serializers.CharField(max_length=100)
  • 2-视图里面使用序列化器
python 复制代码
from rest_framework.views import APIView
from myapp_api.models import User
from .serializers import UserSerializer
from rest_framework.response import Response



class UserView(APIView):
    def get(self, request):
        #获取所有请求
        queryset = User.objects.all()
        #调用序列化器将queryset对象转化为json
        # 如果有多条数据需要指定mang=true
        user_serializer =UserSerializer(queryset, many=True)
        # 获取data属性序列化结果
        return Response(user_serializer.data)
  • 3.定义路由 myapp_api/urls

    from django.contrib import admin
    from django.urls import path,include,re_path
    from rest_framework import routers
    from myapp_api import views

    #注册路由

    urlpatterns = [
    re_path('api/user/$',views.UserView.as_view()),
    ]

    访问http://127.0.0.1:8000/myapp_api/api/user/

  • 获取单个用户(进行查找)

  • 定义视图views

    from rest_framework.views import APIView
    from myapp_api.models import User
    from .serializers import UserSerializer
    from rest_framework.response import Response

    class UserView(APIView):
    def get(self, request ,pk=None):
    if pk:
    # 获取单个用户
    user_obj= User.objects.get(id=pk)
    serializer = UserSerializer(user_obj)
    else:
    #获取所有的用户
    #获取所有请求
    queryset = User.objects.all()
    #调用序列化器将queryset对象转化为json
    # 如果有多条数据需要指定mang=true
    user_serializer =UserSerializer(queryset, many=True)
    # 获取data属性序列化结果
    result = {"code":200,"data":user_serializer.data}
    return result

  • 定义路由

    from django.contrib import admin
    from django.urls import path,include,re_path
    from rest_framework import routers
    from myapp_api import views

    #注册路由

    urlpatterns = [
    re_path('api/user/',views.UserView.as_view()), re_path('api/user/(?P\d+)/',views.UserView.as_view()),
    ]

User -- Django REST framework

  • 创建用户

    复制代码
      def post(self,request):
    
          user_ser = UserSerializer(data=request.data)
          if user_ser.is_valid():
              user_ser.save()
              msg = "创建成功"
              code =200
          else:
              msg = user_ser.errors
              code = 400
          result = {'code':code,'msg':msg}
          return Response(result)
  • 定义create的方法

drf序列化小结

  • 序列化工作流

    序列化(读数据):视图里通过ORM从数据库获取数据查询集对象 -> 数据传入序列化器

    -> 序列化器将数据进行序列化 -> 调用序列化器的.data获取数据 -> 响应返回前端

    反序列化(写数据):视图获取前端提交的数据 -> 数据传入序列化器 -> 调用序列化器

    的.is_valid方法进行效验 -> 调用序列化器的.save()方法保存数据

    序列化器常用方法与属性:

    • serializer.is_valid():调用序列化器验证是否通过,传入raise_exception=True可以在

    验证失败时由DRF响应400异常。

    • serializer.errors:获取反序列化器验证的错误信息

    • serializer.data:获取序列化器返回的数据

    • serializer.save():将验证通过的数据保存到数据库(ORM操作)

DRF序列化器ModelSerializer

  • ModelSerializer类型不需要自定义映射和定义create,update方法使用起来方便很多。

  • -----我认为这是最好的一种方式

    from rest_framework import serializers
    from myapp_api.models import User

    class UserSerializer(serializers.ModelSerializer):
    class Meta:
    model = User
    fields = 'all'

Meta类常用属性:

• fields:显示所有或指定字段

• exclude:排除某个字段,元组格式,不能与fields同时用

• read_only_fields:只读字段,即只用于序列化,不支持修改

• extra_kwargs:添加或修改原有的字段参数,字典格式

• depth:根据关联的数据递归显示,一般是多表

DRF序列化,关联表的显示

例如:应用发布系统项目涉及表

一对多:一个项目有多个应用,一个应用只能属于一个项目

多对多:一个应用部署到多台服务器,一个服务器部署多个应用

相关推荐
2601_962065252 小时前
从零创建一个 Django 项目
后端·python·django
千里码aicood3 小时前
Django 基于Django的电脑推荐与分析可视化系统设计与实现
python·django·电脑
汤姆yu4 小时前
基于Django的学习资料共享与智能推荐系统
后端·python·django·毕业设计·学习资料共享
Mr数据杨14 小时前
【Codex】用学生入学评估模块建立新生能力画像
android·java·javascript·django·codex·项目开发
Mr数据杨14 小时前
【Codex】用部门管理模块维护组织架构与管理层级
架构·django·codex·项目开发
Mr数据杨14 小时前
【Codex】用附件管理模块统一维护系统文件资源
django·codex·项目开发
IT毕设实战小研15 小时前
基于安卓的空气质量查询系统
android·大数据·vue.js·爬虫·python·django·课程设计
Mr数据杨19 小时前
【Codex】用座位划分模块优化班级空间与课堂管理
django·codex·项目开发
Mr数据杨19 小时前
【Codex】用系统配置工作台集中维护平台运行参数
django·codex·项目开发
Mr数据杨21 小时前
【Codex】用学生生活日常模块记录校园生活过程
django·生活·codex·项目开发