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

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

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

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

相关推荐
大叔_爱编程2 小时前
基于Python的交通数据分析应用-hadoop+django
hadoop·python·django·毕业设计·源码·课程设计·交通数据分析
工业互联网专业3 小时前
基于大数据的学习资源推送系统的设计与实现 _django
vue.js·python·django·毕业设计·源码·课程设计·学习资源推送系统
XXX-X-XXJ1 天前
二:RAG 的 “语义密码”:向量、嵌入模型与 Milvus 向量数据库实操
人工智能·git·后端·python·django·milvus
闲人编程1 天前
将你的Django/Flask应用部署到云服务器(Docker实战)
服务器·docker·容器·django·flask·部署·web
IT森林里的程序猿2 天前
基于机器学习方法的网球比赛胜负趋势预测
python·机器学习·django
kobe_OKOK_2 天前
Django ORM 字段查询表达式(Field lookup expressions)
后端·python·django
kobe_OKOK_2 天前
Django ORM 无法通过 `ForeignKey` 自动关联,而是需要 **根据父模型中的某个字段(比如 ID)去查询子模型**。
后端·python·django
濑户川2 天前
深入理解Django 视图与 URL 路由:从基础到实战
后端·python·django
江上月5132 天前
django与vue3的对接流程详解(下)
后端·python·django
万粉变现经纪人3 天前
如何解决 pip install -r requirements.txt 约束文件 constraints.txt 仅允许固定版本(未锁定报错)问题
开发语言·python·r语言·django·beautifulsoup·pandas·pip