如何使用DRF的序列化器之序列化

2021-09-02 11:43:32 字數 4195 閱讀 9852

drf兩大利器為serizlizer序列化器和檢視,而序列化器又分為序列化和反序列化,本篇文章首先來看下drf序列化器的常用序列化方法。

首先來看使用django開發rest介面時的表現,示例**如下:

# views.py

from datetime import datetime

class booksapiview(view):

"""查詢所有圖書、增加圖書

"""def get(self, request):

"""查詢所有圖書

路由:get /books/

"""queryset = bookinfo.objects.all()

book_list =

# 將bookinfo物件轉換為字典

for book in queryset:

'id': book.id,

'btitle': book.btitle,

'bpub_date': book.bpub_date,

'bread': book.bread,

'bcomment': book.bcomment,

'image': book.image.url if book.image else ''

})# book_list為包含很多字典的列表

return jsonresponse(book_list, safe=false)

def post(self, request):

"""新增圖書

路由:post /books/

"""json_bytes = request.body

json_str = json_bytes.decode()

book_dict = json.loads(json_str)

# 此處詳細的校驗引數省略

book = bookinfo.objects.create(

btitle=book_dict.get('btitle'),

bpub_date=datetime.strptime(book_dict.get('bpub_date'), '%y-%m-%d').date()

)return jsonresponse(, status=201)

當我們得到queryset時或者得到乙個bookinfo物件時,需要將bookinfo物件轉換為字典,將包含字典型別資料的列表轉換為json資料響應回去。其中將bookinfo物件轉換為字典的**冗餘的厲害,此時serializer就可以大顯身手了。

使用序列化器首先需要在serializers.py中定義序列化器類:

欄位名稱和模型類中的欄位名相同,欄位的選項約束有很多,預設約束required為true!

詳細可以參看官方文件:

github原始碼:

# 需要繼承drf的serilalizers中的serializer

from rest_framework import serializers

from .models import bookinfo

class bookserializer(serializers.serializer):

id = serializers.integerfield(read_only=true)

btitle = serializers.charfield(

min_length=3,

max_length=10,

error_messages=

)bpub_date = serializers.datefield()

bread = serializers.integerfield()

建立serializer物件

定義好serializer類後,就可以建立serializer物件了。

serializer的構造方法為:

serializer(instance=none, data=empty, **kwarg)
說明:

1)用於序列化時,將模型類物件傳入instance引數

2)用於反序列化時,將要被反序列化的資料傳入data引數

3)除了instance和data引數外,在構造serializer物件時,還可通過context引數額外新增資料,如

serializer = accountserializer(account, context=)
通過context引數附加的資料,可以通過serializer物件的context屬性獲取

掌握了上述知識後我們就可以開始進行序列化操作了

class book2view(view):

def get(self, request):

# 序列化列表

blist = bookinfo.objects.all()

# 1.建立序列化物件,如果被序列化的是包含多條資料的查詢集queryset

# 需要新增many=true引數補充說明

# 以列表為引數,列表中是模型類物件

serializer = serializers.bookserializer(blist, many=true)

# 2.呼叫屬性data,通過data屬性可以獲取序列化後的資料

# 獲取轉換後的列表,列表中是有序字典物件

"""[ordereddict([('id', 2), ('btitle', '天龍八部'), ('bpub_date', '1986-07-24'), ('bread', 36), ('bcomment', 40)]), ordereddict([('id', 3), ('btitle', '笑傲江湖'), ('bpub_date', '1995-12-24'), ('bread', 20), ('bcomment', 80)])]

"""book_dict_list = serializer.data

# 響應

return jsonresponse(book_dict_list, safe=false)

關聯物件巢狀序列化

如果需要序列化的資料中包含有其他關聯物件,則對關聯物件資料的序列化需要指明。注:書籍與英雄的關係為一對多

在定義序列化器類的**中新增如下**,注意在定義關聯屬性時,必須新增約束read_only = true

# 關係屬性輸出的3種方案

# 1.主鍵 此字段將被序列化為關聯物件的主鍵。

# heros = serializers.primarykeyrelatedfield(read_only=true, many=true)

# 2.字串

# heros = serializers.stringrelatedfield(read_only=true, many=true)

# 3.自定義序列化器

heros = heroserializer(read_only=true, many=true)

如果關聯的物件資料不是只有乙個,而是包含多個資料,如想序列化圖書bookinfo資料,每個bookinfo物件關聯的英雄heroinfo物件可能有多個,則在約束中新增many=true引數即可。

primarykeyrelatedfield: 此字段將被序列化為關聯物件的主鍵

stringrelatedfield:此字段將被序列化為關聯物件的字串表示方式(即__str__方法的返回值)(定義模型類時新增__str__方法)

heroserializer:使用關聯物件的序列化器,需要自己定義關聯物件的序列化器

序列化器的序列化方法幫助我們封裝了將python型別(模型類物件、模型類物件的列表)轉換為字典的過程,加快開發效率。

# 將模型類物件轉換成字典的過程

serializer = serializers.heroserializer(hero)

hero_dict = serializer.data

# 將模型類物件的列表轉換為字典列表

serializer = serializers.bookserializer(blist, many=true)

book_dict_list = serializer.data

drf之序列化器

1.drf框架定義的序列化流程 1.狹義上的序列化定義 資料流向 後端到前段 後端負責處理資料處理流程 模型類物件 字典 json字串 drf約定的序列化流程 1.通過django模型類獲取資料庫資料構建模型類物件 2.把模型類物件轉化為字典 3.把字典轉化為json格式的字串 2.drf框架的反序...

drf 序列化器

序列化器 和 django中 的 form 和 modelform 有類似的地方 因為 在 drf 中,沒有模板的概念,所以 序列化的主要作用 是對響應的資料做序列化的,還可以對 接收到的資料做序列化 serializer 序列化 查詢的結果queryset user.objects.all ser...

drf 序列化器

models.pyclass chargepolicydetail models.model purpose c models.apartment.purpose category c models.apartment.category name models.charfield max lengt...