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. 使用序列化器對數據進行操做。

既然,說到要對數據進項操做,那麼,可想而知,就必定分爲序列化和反序列化兩種操做。ui

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

序列化操做:模型數據 --> 字典數據 --? JOSN數據rest

序列化操做:

 單個模型數據的序列化操做:序列化器名稱(instance='模型數據')

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

Shell測試代碼以下:code

>>> 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)

由於,咱們要進行嵌套序列化操做,因此,須要在多關係模型中補充對一關係模型的關聯字段。blog

其中,分爲如下三種狀況:開發

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序列化器的序列化操做就講完啦。

那麼,接下來咱們就要進行反序列化操做的學習啦。

相關文章
相關標籤/搜索