1. 程式人生 > >DRF框架之Serializer序列化器的序列化操作

DRF框架之Serializer序列化器的序列化操作

在DRF框架中,有兩種序列化器,一種是Serializer,另一種是ModelSerializer.

今天,我們就先來學習一下Serializer序列化器。

使用Serializer序列化器的開發步驟:

1. 定義Serializer序列化器

首先,我們要在子應用中,建立見一個serializers.py檔案,用來編寫Serializer序列化器程式碼。

from rest_framework import serializers
# 定義序列化器


class BookInfoSerializer(serializers.Serializer):
    '''定義圖書序Serializer序列化器'''
    # 這裡的欄位需要和模型類中的欄位名、欄位型別、約束一致
    id = serializers.IntegerField(label='ID', read_only=True)
    btitle = serializers.CharField(label='名稱', max_length=20)
    bpub_date = serializers.DateField(label='釋出日期', required=False)
    bread = serializers.IntegerField(label='閱讀量', required=False)
    bcomment = serializers.IntegerField(label='評論量', required=False)

2. 使用序列化器對資料進行操作。

既然,說到要對資料進項操作,那麼,可想而知,就一定分為序列化和反序列化兩種操作。

首先呢,我們先來明確一下什麼叫做序列化操作?

序列化操作:模型資料 --> 字典資料 --? JOSN資料

序列化操作:

 單個模型資料的序列化操作:序列化器名稱(instance='模型資料')

 查詢集模型資料的序列化操作:序列化器名稱(instance='模型資料集', many=True)  ---> many的意思就是告訴序列化器這是一個查詢集。

Shell測試程式碼如下:

>>> from booktest.models import BookInfo
>>> from booktest.serializers import BookInfoSerializer
>>> book = BookInfo.objects.get(id=2)
>>> book
<BookInfo: 天龍八部>
>>> s = BookInfoSerializer(instance=book)
>>> s.data
{'bread': 36, 'btitle': '天龍八部', 'bpub_date': '1986-07-24', 'id': 2, 'bcomment': 40}
>>> books = BookInfo.objects.all()
>>> s = BookInfoSerializer(instance=books, many=True)
>>> s.data
[OrderedDict([('id', 1), ('btitle', '射鵰英雄傳'), ('bpub_date', '1980-05-01'), ('bread', 12), ('bcomment', 34)]), OrderedDict([('id', 2), ('btitle龍八部'), ('bpub_date', '1986-07-24'), ('bread', 36), ('bcomment', 40)]), OrderedDict([('id', 3), ('btitle', '笑傲江湖'), ('bpub_date', '1995-12-24read', 20), ('bcomment', 80)]), OrderedDict([('id', 4), ('btitle', '雪山飛狐'), ('bpub_date', '1987-11-11'), ('bread', 58), ('bcomment', 24)]), OrdDict([('id', 9), ('btitle', '西遊記'), ('bpub_date', '2020-02-05'), ('bread', 18), ('bcomment', 7)])]

關聯對巢狀序列化:

多對一巢狀序列化操作:在序列化多關係模型資料時,也要將一關係模型資料序列化出來。

首先,我們需要定義一個多關係模型的序列化器。

class HeroInfoSerializer(serializers.Serializer):
    """英雄資料序列化器"""

    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    id = serializers.IntegerField(label='ID', read_only=True)
    hname = serializers.CharField(label='名字', max_length=20)
    hgender = serializers.ChoiceField(label='性別', choices=GENDER_CHOICES, required=False)
    hcomment = serializers.CharField(label='描述資訊', max_length=200, required=False, allow_null=True)

因為,我們要進行巢狀序列化操作,所以,需要在多關係模型中補充對一關係模型的關聯欄位。

其中,分為以下三種情況:

1. 使用外來鍵id作為關聯(serializers.PrimaryKeyRelatedField):在多模型資料序列化時,會將對應的一關係模型資料的主鍵id序列化出來。

2. 使用一關係模型類中的str方法做關聯(serializers.StringRelatedField):表示使用一模型類中的__str__方法的返回值作為關聯,序列化出來的資料是多關係模型序列化後的資料和str方法的返回值。

3. 使用一關係模型類的序列化器做關聯(BookInfoSerializer()):在多關係模型資料序列化時,會將對應的一關係模型資料全部序列化出來

需要,在多關係模型序列化器中補充的程式碼如下:

    # 補充多對一查詢關聯欄位
    # PrimaryKeyRelatedField:表示當前表中的外來鍵,通過這種方式序列化出來的為外來鍵ID
    hbook = serializers.PrimaryKeyRelatedField(read_only=True, label='主鍵')

    # StringRelatedField:表示使用模型類中的__str__方法,返回的值作為關聯,序列化出來的資料是str方法的返回值
    hbook = serializers.StringRelatedField(label='圖書')

    # BookInfoSerializer:以關聯模型類的序列化器作為關聯,序列化出來的資料是關聯物件的所有資料
    hbook = BookInfoSerializer()
一對多的巢狀序列化操作:在序列化一關係模型資料時,將多關係模型的資料也序列化出來。

我們已經在上面定義過了一個一關係模型的序列化器了,我們直接複用就可以。

同樣,我們也需要對一關係模型序列化器中補充一關係模型對多關係模型的關聯欄位。

其中,和多對一序列化一樣,也是分為三種情況(但是,我們只需要記住使用外來鍵id作為關聯欄位即可):

使用外來鍵id作為關聯(serializers.PrimaryKeyRelatedField):在一模型資料序列化時,會將對應的多關係模型資料的主鍵id序列化出來。

需要,在一關係模型序列化器中補充的程式碼如下:

    # 補充一對多關聯物件序列化欄位
    # 多方類名小寫_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True),序列化的是關聯物件的id
    heroinfo_set = serializers.PrimaryKeyRelatedField(label='英雄',read_only=True, many=True)

至此,我們的Serializer序列化器的序列化操作就講完啦。

那麼,接下來我們就要進行反序列化操作的學習