设为首页 加入收藏

TOP

序列化组件(一)
2023-07-23 13:45:14 】 浏览:50
Tags:

序列化组件的三大功能

  1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串

  2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型

  3. 反序列化时同时会完成数据校验功能

序列化器Serializer使用方法

查询单个数据语法:

1.在setting.py中的app配置里注册一下drf

image

2.在django的模型层创建一个表

from django.db import models

# Create your models here.
class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    author = models.CharField(max_length=32)

3.在表中添加一些数据

4.编写序列化组件(类似forms组件),可以在应用下单独创一个文件夹,里面放序列化组件.py

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

# 创建一个类继承Serializer序列化类
class BookSerializer(serializers.Serializer):
    # 定义需要序列化的字段,想要哪个字段就添加该字段,不需要就注释掉
    nid = serializers.CharField()
    name = serializers.CharField()
    price = serializers.CharField()

5.在url.py中开设路径获取序列化之后的数据

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^book/(?P<pk>\d+)/$',views.BooksView.as_view()) #CBV格式的url
]

6.在视图函数中序列化需要的模型对象,返回给前端页面字典格式的数据

from rest_framework.views import APIView  # 导入drf模块的apiview,使得cbv格式的视图函数继承它
from app01 import models
from .ser import BookSerializer # 导入自己写好的序列化组件
from rest_framework.response import Response # 导入drf模块的响应类

class BooksView(APIView):
    # get请求的视图函数
    def get(self,request,pk):
        # 得到需要查询的模型对象
        book = models.Book.objects.filter(pk=pk).first()
        # 将模型对象交给自己写好的序列化器,生成一个序列化对象
        book_ser = BookSerializer(book)
        # book_ser.data 序列化对象.data就是序列化后的字典
        return Response(book_ser.data) # 利用drf中的Response类返回给前端,Response会帮您把这个字典序列化成json格式!
        # 使用JsonResponse返回上述字典,在浏览器就没有Response漂亮的格式而已,也是返回json数据格式
        return JsonResponse(book_ser.data,json_dumps_params={'ensure_ascii':False})

查询所有语法:

# views.py
class BooksView(APIView):
    def get(self,request):
        response_msg = {'status': 100, 'msg': '成功'}
        books=Book.objects.all()
        book_ser=BookSerializer(books,many=True)  #序列化多条,如果序列化一条,不需要写
        response_msg['data']=book_ser.data
        return Response(response_msg)
    
#urls.py
path('books/', views.BooksView.as_view()),

修改数据语法

1.在cbv格式的视图函数中添加put函数

    def put(self,request,pk):
        back_dic = {'code':1000,'msg':'成功'}
        # 1.得到需要查询的模型对象
        book = models.Book.objects.filter(pk=pk).first()
        # 2. 将模型对象交给自己写好的序列化器,生成一个序列化对象,除了传模型对象,还需要传入用户修改的数据
        book_ser = BookSerializer(instance=book,data=request.data)
        # 3.进行数据校验,类似forms组件的校验
        is_right = book_ser.is_valid()
        if is_right:
            # 4.校验通过操作序列化对象保存修改数据
            book_ser.save() # 注意这里需要在序列化组件中重写update()方法,否则报错
            # 5.将正确的数据在返回给前端
            back_dic['data'] = book_ser.data
        else:
            back_dic['code'] = 1001
            back_dic['msg'] = '数据格式不正确'
            back_dic['data'] = book_ser.errors
        return Response(back_dic)

2.在自定义的序列化组件类中添加update()方法

    def update(self, instance, validated_data):
        # instance参数就是book这个对象,validated_data就是用户修改提交上来的字典格式数据
        # 1.修改这个对象的字段值
        instance.name = validated_data.get('name')
        instance.price = validated_data.get('price')
        # 2.操作数据库保存修改数据
        instance.save() # 相当于book.save() 是django orm提供的方法
        # 最后需要把这个book对象在返回出去
        return instance

新增数据语法

# views.py
class BooksView(APIView):

    # 新增
    def post(self,request):
        response_msg = {'status': 100, 'msg': '成功'}
        #修改才有instance,新增没有instance,只有data
        book_ser = BookSerializer(data=request.data)
        # book_ser = BookSerializer(request.data)  # 这个按位置传request.data会给instance,就报错了
        # 校验字段
        if book_ser.is_v
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Behave 安装 下一篇Python进制转换详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目