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序列化,关联表的显示

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

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

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

相关推荐
dreams_dream5 小时前
Django的Settings 配置文件详解
数据库·django·sqlite
dreams_dream11 小时前
django错误记录
后端·python·django
captainOO719 小时前
MRO and mixin in Python Django
后端·python·django
义达3 天前
Django环境下使用wsgi启动MCP服务
后端·django·mcp
PythonicCC3 天前
Django中的MVC和MVT模式
数据库·django·mvc
PythonicCC4 天前
Django的生命周期
python·django·sqlite
天庭鸡腿哥4 天前
比Windows系统自带更强大,好用!
windows·django·pygame
Q_Q5110082854 天前
python的校园研招网系统
开发语言·spring boot·python·django·flask·node.js·php
言之。4 天前
Django REST框架核心:GenericAPIView详解
数据库·python·django