序列化組件

来源:https://www.cnblogs.com/suncolor/archive/2022/10/15/16795197.html
-Advertisement-
Play Games

序列化組件的三大功能 序列化,序列化器會把模型對象轉換成字典,經過response以後變成json字元串 反序列化,把客戶端發送過來的數據,經過request以後變成字典,序列化器可以把字典轉成模型 反序列化時同時會完成數據校驗功能 序列化器Serializer使用方法 查詢單個數據語法: 1.在s ...


序列化組件的三大功能

  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_valid():
            book_ser.save()
            response_msg['data']=book_ser.data
        else:
            response_msg['status']=102
            response_msg['msg']='數據校驗失敗'
            response_msg['data']=book_ser.errors
        return Response(response_msg)
#ser.py 序列化類重寫create方法
    def create(self, validated_data):
        instance=Book.objects.create(**validated_data)
        return instance
# urls.py
path('books/', views.BooksView.as_view()),

刪除數據語法:

# views.py
class BookView(APIView):
    def delete(self,request,pk):
        ret=Book.objects.filter(pk=pk).delete()
        return Response({'status':100,'msg':'刪除成功'})
# urls.py
re_path('books/(?P<pk>\d+)', views.BookView.as_view()),

序列化的欄位類型

常用欄位類型

# BooleanField	BooleanField()
# NullBooleanField	NullBooleanField()
# CharField	CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
# EmailField	EmailField(max_length=None, min_length=None, allow_blank=False)
# RegexField	RegexField(regex, max_length=None, min_length=None, allow_blank=False)
# SlugField	SlugField(maxlength=50, min_length=None, allow_blank=False) 正則欄位,驗證正則模式 [a-zA-Z0-9-]+
# URLField	URLField(max_length=200, min_length=None, allow_blank=False)
# UUIDField	UUIDField(format=’hex_verbose’) format: 1) 'hex_verbose' 如"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) 'hex' 如 "5ce0e9a55ffa654bcee01238041fb31a" 3)'int' - 如: "123456789012312313134124512351145145114" 4)'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
# IPAddressField	IPAddressField(protocol=’both’, unpack_ipv4=False, **options)
# IntegerField	IntegerField(max_value=None, min_value=None)
# FloatField	FloatField(max_value=None, min_value=None)
# DecimalField	DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位數 decimal_palces: 小數點位置
# DateTimeField	DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)
# DateField	DateField(format=api_settings.DATE_FORMAT, input_formats=None)
# TimeField	TimeField(format=api_settings.TIME_FORMAT, input_formats=None)
# DurationField	DurationField()
# ChoiceField	ChoiceField(choices) choices與Django的用法相同
# MultipleChoiceField	MultipleChoiceField(choices)
# FileField	FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
# ImageField	ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)

需要記住的欄位類型

CharField
BooleanField
IntegerField
DecimalField
ListField
DictField

常用的欄位參數

1 給CharField欄位類使用的參數
    max_length        最長長度
    min_length        最小長度
    allow_blank       是否允許為空
    trim_whitespace   是否截斷空白欄位

2 給IntegerField欄位類使用的參數
    max_value         最小值
    min_value         最大值

3 通用參數,放在哪個欄位類上都可以
    required          表明該欄位在反序列化時必須輸入,預設True
    default           反序列化時使用的預設值
    allow_null        表明該欄位是否允許傳入None,預設False
    validators        該欄位使用的驗證器
    error_messages    包含錯誤編碼與錯誤信息的字典
    label             用於HTML展示API頁面時,顯示的欄位名稱
    help_text         用於Html展示API頁面時,顯示的欄位幫助提示信息

4 重點
read_only	表明該欄位僅用於序列化輸出,預設False,如果設置成True,postman中可以看到該欄位,修改時,不需要傳該欄位
write_only	表明該欄位僅用於反序列化輸入,預設False,如果設置成True,postman中看不到該欄位,修改時,該欄位需要傳

序列化組件中的鉤子函數和validators校驗

局部鉤子:

    # 序列化組件中的鉤子函數
    # 局部鉤子函數validate_欄位名的形式,需要傳入一個data參數,data就是price
    def validate_price(self, data):
        print(type(data)) #格式為<class 'str'>
        print(data) # 34.00
        # 進行校驗,當價格大於30報錯
        if float(data) < 30:
            return data
        else:
            # 校驗不通過,拋出異常 rest_framework異常在 from rest_framework.exceptions import ValidationError里
            raise ValidationError('價格太高')

全局鉤子:

    def validate(self,validated_data): # validated_data校驗之後的數據
        name = validated_data.get('name')
        price = validated_data.get('price')
        if name == 'zhang' and price == '25':
            raise ValidationError('不正確')
        return validated_data

第三種validators校驗:

# 定義一個函數
def check_name(data):
    if data.startswith('sb'):
        raise ValidationError('名字不能是sb開頭')
    else:
        return data

# 在指定欄位內添加validators
name = serializers.CharField(validators=[check_name])   #validators=[]列表中寫函數的記憶體地址

總結:主要用局部鉤子和validators校驗,全局基本不用!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2022 年 10 月 13 日- PostgreSQL 全球開發組今天宣佈發佈 PostgreSQL 15,這是世界上最先進的開源資料庫的最新版本。 PostgreSQL 15 建立在最近版本的性能改進的基礎上,在管理本地和分散式部署中的工作負載方面取得了顯著收益,包括改進的排序。此版本通過... ...
  • 相關術語: DB :資料庫:在硬碟上以文件的方式存在DBMS:資料庫管理系統:例如mysql,oracle,sqlserver…SQL:一門適用於所有DBMS,對DB進行操作的標準規劃語言,DQL:資料庫查詢語句 select,DML:資料庫管理語句,修改表中數據update,insert,dele ...
  • 什麼是枚舉Enum 枚舉 Enum是在眾多語言中都有的一種數據類型,JavaScript中還沒有(TypeScript有)。用來表示一些特定類別的常量數據,如性別、學歷、方向、賬戶狀態等,項目開發中是很常用的。 | Text文字(界面顯示) | key編碼(編碼、存儲使用) | 數字value值(存 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 LocalStorage 是HTML5中一個方便使用的 API,它為 Web 開發人員 提供了一個易於使用的5MB的存儲空間。使用 LocalStorage API 真的再簡單不過了。不信看下: //Save a value to loc ...
  • 概述 在上一節中介紹了兩種加密方法 對稱加密 非對稱加密 其中對稱加密性能高,但是有泄露密鑰的風險,而非對稱加密相反,加密性能較差,但是密鑰不易泄露,那麼能不能把他們進行一下結合呢? HTTPS採用混合加密 HTTPS經由HTTP進行通信,但利用SSL/TLS來加密數據包,而SSL/TLS的加密方式 ...
  • 在筆者上一篇文章`《驅動開發:內核枚舉IoTimer定時器》`中我們通過`IoInitializeTimer`這個API函數為跳板,向下掃描特征碼獲取到了`IopTimerQueueHead`也就是IO定時器的隊列頭,本章學習的枚舉DPC定時器依然使用特征碼掃描,唯一不同的是在新版系統中DPC是被異... ...
  • @ConditionalOnProperty實現按需註入bean 簡訊工具類 SmsUtil zhenghe-common是一個基礎包。 SmsUtil坐落在zhenghe-common里。先看看Smsutil的面目。 package com.emax.zhenghe.common.util; im ...
  • 問題現象 最近在本地調試公司的一個Web項目時,無意中發現日誌中出現了兩次同一個服務的init記錄,項目都是基於Spring來搭建的,按理說服務都是單例的,應該只有一次服務載入日誌才對,本著對工作認真負責(閑來無事)的態度,必然要一探究竟。 問題分析 為什麼同一個 Bean 會被容器初始化兩次? 首 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...