1. 程式人生 > 其它 >Django-drf-002-序列化器

Django-drf-002-序列化器

序列化器

介紹

  在Django中,前端傳來的資料,一般是JSON格式的資料,獲取資料需要通過request.POST.get('xxx)的形式拿到資料,對資料操作完後,返回給前端,也需要轉成JSON格式,比較麻煩。

  drf中提供了序列化器的功能,解決了這一過程

功能

  序列化:把模型物件轉為字典,經過response後轉成JSON字串

  反序列化:把客戶端傳來的資料,經過request後轉為字典。並完成資料校驗功能。序列化器可以把字典轉為模型物件。

Serializer

定義一個Serializer型別的序列化器

Serializer型別的序列化器不指定模型表

 1 # 新建一個py檔案
2 from rest_framework import serializers 3 4 5 class BookSerializer(serializers.Serializer):
    # 這裡沒有指定模型表,但是欄位還是要對應
6 # 想序列化哪些欄位,就寫哪些欄位 7 id = serializers.CharField() 8 name = serializers.CharField() 9 price = serializers.CharField() 10 author = serializers.CharField()
11 publish = serializers.CharField()

使用Serializer型別的序列化器

過程:通過ORM從資料庫獲取資料物件-->呼叫序列化器,序列化資料-->將序列化的資料返回給前端

在檢視類中使用

 1 from rest_framework.views import APIView
 2 from api import models
 3 from api import ser
 4 from rest_framework.response import Response
 5 
 6 
 7 class BoosView(APIView):
8 def get(self,request,pk): 9 # 根據pk拿資料 10 book_queryset = models.Books.objects.filter(id=pk).first() 11 # 呼叫序列化元件,序列化資料 12 book_ser = ser.BookSerializer(book_queryset) 13 # 序列化物件.data就是序列化後的字典 14 return Response(book_ser.data)

常用選項

- max_length

- min_length

- allow_blank:是否允許為空

- trim_whitespace:是否截斷空白字元

-max_value

-min_value

- required:表名該欄位在反序列化時必須輸入,預設True

-default:反序列化時設定預設值

-allow_null:允許傳null,預設False

-validators:該欄位使用的驗證器

- error_message:包含錯誤編號與錯誤資訊的字典

- read_only:表名該欄位僅用於序列化輸出,預設False,若設定為True,在postman中可以看到欄位,修改時,不需要傳給該欄位傳值

- write_only:表名該欄位段僅用於反序列化輸入,預設False,若設定為True,在postman中看不到該欄位,修改時,需要給該欄位傳值

區域性鉤子函式

from rest_framework.exceptions import ValidationError
# 區域性鉤子
    def validate_price(self, data): # 鉤子的名字規則:valiedate_欄位名,然後接收一個引數
        # 如price,價格低於10,校驗失敗
        if float(data) > 10:
            return data # 鉤出來的資料要return
        else:
            # 校驗失敗,丟擲異常
            raise ValidationError('價格太低')

全域性鉤子函式

# 全域性鉤子
    def validate(self,validate_date):
        author = validate_date.get('author') # 獲取校驗後的資料
        publish = validate_date.get('publish')
        if author == publish:
            raise ValidationError('作者名字和出版社一樣')
        else:
            return validate_date # 鉤出來的資料要return

使用validators校驗

# ser.py 序列化類中寫
def check_author(data):
    if data.startswith('sb'):
        raise ValidationError('作者名字不能以sb開頭')
    else:
        return data
    
class BookSerializer(serializers.Serializer):
    # 需要序列化哪些欄位,就寫哪些欄位
    author = serializers.CharField(validators=[check_author]) # validators後面可以放函式的記憶體地址,把author對應的資料傳進去做校驗

END.