1、定義序列化器
2、使用序列化器
3、關聯物件序列化
先在專案根目錄下建立乙個應用: [
'rest_framework'
,'demo',]
在demo目錄下的models.py新增如下**:
from django.db import models
# create your models here.
class
classinfo
(models.model)
: number = models.integerfield(verbose_name=
'班級編號'
) grade = models.charfield(verbose_name=
'年級'
, max_length=3)
class
studentinfo
(models.model)
: name = models.charfield(max_length=
10, verbose_name=
'姓名'
) *** = models.charfield(max_length=
1, verbose_name=
'性別'
) from_class = models.foreignkey(classinfo, on_delete=models.cascade)
在專案根目錄輸入如下命令遷移:
python manage.py makemigrations
python manage.py migrate
有如下結果說明資料遷移成功:
為了對model資料進行序列化和反序列化,需要為對應的model提供乙個序列化器,在demo目錄下建立乙個serializers.py,先給classinfo新增乙個序列化器:
from rest_framework import serializers
class
classinfoserializer
(serializers.serializer)
:"""班級資料序列化器"""
id= serializers.integerfield(label=
'id'
, read_only=
true
) number = serializers.integerfield(label=
'班級編號'
) grade = serializers.charfield(label=
'年級'
, max_length=
3)
為了方便,我們將在django shell中使用,在專案根目錄輸入如下命令:
python manage.py shell
1、先插入一條測試資料
>>
> from demo.models import classinfo
>>
> classinfo.objects.
create
(number=
1, grade=
"三年級"
)
2、獲取該條資料物件
>>
> class_data = classinfo.objects.
get(id=
1)
3、構建序列化器物件並獲取資料
>>
> from demo.serializers import classinfoserializer
>>
> serializer =
classinfoserializer
(class_data)
>>
> serializer.data
結果:
注意:如果要被序列化的是包含多條資料的查詢集queryset,可以通過新增many=true引數補充說明
>>
> classinfo.objects.
create
(number=
1, grade=
"二年級"
)>
>>
> classinfo.objects.
create
(number=
1, grade=
"一年級"
)>
>>
> class_list = classinfo.objects.
all(
)>>
> serializer =
classinfoserializer
(class_list, many=true)
>>
> serializer.data
當需要序列化的物件包含外來鍵時,需要使用primarykeyrelatedfield欄位關聯被序列化為關聯物件的主鍵。在serializers.py新增studentinfo的序列化器:
>>
>
from demo.models import studentinfo
>>
> class_data = classinfo.objects.get(id=
1)>>
> studentinfo.objects.create(name=
"張三"
, ***=
"男", from_class = class_data)
>>
>
from demo.serializers import studentinfoserializer
>>
> serializer = studentinfoserializer(student)
>>
> serializer.data
結果:
注意:如果關聯的物件資料不是只有乙個,而是包含多個資料,如想序列化classinfo資料,每個classinfo物件關聯的studentinfo物件可能有多個,此時關聯字段型別的指明仍可使用上述幾種方式,只是在宣告關聯欄位時,多補充乙個many=true引數即可。
class
classinfoserializer
(serializers.serializer)
:"""班級資料序列化器"""
id= serializers.integerfield(label=
'id'
, read_only=
true
) number = serializers.integerfield(label=
'班級編號'
) grade = serializers.charfield(label=
'年級'
, max_length=3)
studentinfo_set = serializers.primarykeyrelatedfield(read_only=
true
, many=
true
)# 新增,名字不能改
使用:
>>
> from demo.models import classinfo
>>
> from demo.serializers import classinfoserializer
>>
> class_data = classinfo.objects.
get(id=1)
>>
> serializer =
classinfoserializer
(class_data)
結果:
下一章: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...
drf序列化元件
restful規範 前後端分離 前端乙個專案,後端乙個專案 1 通常使用https協議 2.網域名稱部署 api.baidu.com www.baidu.com api 3.版本 www.baidu.com api v2 版本號放在請求頭中 4.路徑都是名詞 可以用複數 5.根據不同的請求方式,執行...