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引數即可。序列化器的序列化方法幫助我們封裝了將python型別(模型類物件、模型類物件的列表)轉換為字典的過程,加快開發效率。primarykeyrelatedfield: 此字段將被序列化為關聯物件的主鍵
stringrelatedfield:此字段將被序列化為關聯物件的字串表示方式(即__str__方法的返回值)(定義模型類時新增__str__方法)
heroserializer:使用關聯物件的序列化器,需要自己定義關聯物件的序列化器
# 將模型類物件轉換成字典的過程
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...