1. 程式人生 > 其它 >DRF學習筆記(一):資料序列化

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

技術標籤:pythondjango

文章目錄


準備

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)

結果:
在這裡插入圖片描述