DRF學習筆記(一):資料序列化
阿新 • • 發佈:2020-12-30
文章目錄
準備
1.建立應用
先在專案根目錄下建立一個應用:
python manage.py startapp demo
在settings.py新增建立的app
INSTALLED_APPS = [
'rest_framework',
'demo',
]
2.建立model
在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='姓名')
sex = models.CharField(max_length=1, verbose_name='性別' )
from_class = models.ForeignKey(ClassInfo, on_delete=models.CASCADE)
在專案根目錄輸入如下命令遷移:
python manage.py makemigrations
python manage.py migrate
有如下結果說明資料遷移成功:
1、定義序列化器
為了對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)
2、使用序列化器
為了方便,我們將在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: ClassInfo object (2)>
>>> ClassInfo.objects.create(number=1, grade="一年級")
<ClassInfo: ClassInfo object (3)>
>>> class_list = ClassInfo.objects.all()
>>> serializer = ClassInfoSerializer(class_list, many=True)
>>> serializer.data
結果:
3、關聯物件序列化
當需要序列化的物件包含外來鍵時,需要使用PrimaryKeyRelatedField欄位關聯被序列化為關聯物件的主鍵。在serializers.py新增StudentInfo的序列化器:
>>> from demo.models import StudentInfo
>>> class_data = ClassInfo.objects.get(id=1)
>>> StudentInfo.objects.create(name="張三", sex="男", 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)
結果: