DRF學習筆記 一) 資料序列化

2021-10-13 09:41:11 字數 4137 閱讀 7821

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.根據不同的請求方式,執行...