django rest framework-序列化

為什么要使用Rest Framework鸠踪?

Django REST Framework可以在Django的基礎(chǔ)上迅速實(shí)現(xiàn)API俐芯,并且自身還帶有WEB的測試頁面,可以方便的測試自己的API。

Django REST framework 簡介

序列化和反序列化可以復(fù)用
增:效驗(yàn)請求數(shù)據(jù) > 執(zhí)行反序列化過程 > 保存數(shù)據(jù)庫 > 將保存的對象序列化并返回
刪:判斷要刪除的數(shù)據(jù)是否存在 > 執(zhí)行數(shù)據(jù)庫刪除
改:判斷要修改的數(shù)據(jù)是否存在 > 效驗(yàn)請求的參數(shù) > 執(zhí)行反序列化過程 > 保存數(shù)據(jù)庫 > 將保存的對象序列化并返回
查:查詢數(shù)據(jù)庫 > 將數(shù)據(jù)序列化并返回
特點(diǎn):

  1. 提供了定義序列化器Serializer的方法,可以快速根據(jù)Django ORM 或者其他庫自動序列化/反序列化
  2. 提供了豐富的類視圖\MIXIN擴(kuò)展類,簡化視圖的編寫
  3. 豐富的定制層級:函數(shù)視圖\類視圖\試圖結(jié)合到自動生成API,滿足各種需要
  4. 多種身份認(rèn)證和權(quán)限認(rèn)證方式的支持
  5. 內(nèi)置了限流系統(tǒng)
  6. 直觀的API web界面
  7. 可擴(kuò)展性 , 插件豐富
Django rest framework核心任務(wù)
  1. 多了個serializer.py文件
    這個文件的作用是Serializersquerysetsmodel instances這些復(fù)雜的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為native python以便以json搞乏,xml或其他內(nèi)容類型的形式render出去。
  2. 視圖的核心功能變了
  1. 將數(shù)據(jù)庫數(shù)據(jù)序列化為前端需要的格式并返回戒努;
  2. 將前端發(fā)送過來的數(shù)據(jù)反序列化為模型類型對象请敦,并保存到數(shù)據(jù)庫中镐躲。

開始Django rest framework旅程

安裝第三方庫
pip install django
pip install djangorestframework
配置
  • 在settings.py的app中添加
INSTALLED_APPS = [
    'rest_framework', # DRF
]
創(chuàng)建模型類(Model)
# 欄目
class Column(models.Model):
    name = models.CharField(max_length=20, unique=True, verbose_name='欄目')
    link_url = models.URLField(verbose_name= '鏈接')
    index = models.IntegerField(verbose_name='位置')

    class Meta:  # 模型元選項
        db_table = 'tb_column'   # 在數(shù)據(jù)庫中的表名,否則Django自動生成為app名字_類名
        ordering = ['index']
        verbose_name = '欄目'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name
創(chuàng)建一個序列化類(Serializer)

在app目錄下新建serializer.py

from rest_framework import serializers
from article.models import Column

class ColumnSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=20, label='欄目')
    link_url = serializers.URLField(label= '鏈接')
    index = serializers.IntegerField(label='位置')


    def create(self, validated_data): # create()和update()方法定義了在調(diào)用serializer.save()時成熟的實(shí)例是如何被創(chuàng)建和修改的侍筛。
        return Column.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.link_url = validated_data.get('link_url', instance.link_url)
        instance.index = validated_data.get('index', instance.index)
        instance.save()
        return instance

注意
各字段與模型類中的字段是否一致萤皂。

編寫視圖(APIView)
from article.models import Column
from .serializers import ColumnSerializer
from rest_framework.views import APIView
from rest_framework.response import Response


class ColumnView(APIView):
    def get(self, request):
        # 獲取queryset
        columns = Column.objects.all()
        # 開始序列化;
        serializer_data = ColumnSerializer(columns, many=True)

        #print(serializer_data)

        # print(serializer_data.data)

        # 獲取序列化后的數(shù)據(jù)匣椰,返回給客戶端
        return Response(serializer_data.data)

    def post(self, request):
        # 獲取數(shù)據(jù)
        client_data = request.data

        # 序列化數(shù)據(jù)
        verified_data = ColumnSerializer(data=client_data)
        #print(verified_data)

        # 校驗(yàn)數(shù)據(jù)
        if verified_data.is_valid():
            column = verified_data.save()
            #print(verified_data.data) # 需要保存之后才能獲取.data
            return Response(verified_data.data)
        else:
            return Response(verified_data.errors, status=400)
    
      
     def put(self, request, column_id):
           column_obj =  Column.objects.get(pk=column_id)
           verified_data = ColumnSerializer(instance=column_obj , data=request.data)
            # 校驗(yàn)數(shù)據(jù)
            if verified_data.is_valid():
                column = verified_data.save()
                #print(verified_data.data) # 需要保存之后才能獲取.data
                return Response(verified_data.data)
            else:
                return Response(verified_data.errors, status=400)
              
      def delete(self, request, column_id):
            column_obj =  Column.objects.get(pk=column_id)
            column_obj.delete()
            return Response({'message': 'OK'})                
           
            
配置URL地址
app_name = 'api'
urlpatterns = [
      path('column/', ColumnView.as_view(), name='column'),
]
利用postman測試

get獲取數(shù)據(jù)列表信息


image.png

get方法中兩個輸出語句為


image.png

post增加數(shù)據(jù):
image.png

輸出語句


image.png

我們將視圖修改下裆熙,獲取單個數(shù)據(jù)


image.png

image.png

由以上可以看出API與我們的表單(forms)很相似,除了將模型實(shí)例(model instance)序列化外禽笑,我們也能序列化查詢集(querysets)入录,只需要添加一個序列化參數(shù)many=True。

使用模型序列化ModelSerializers

我們定義的ColumnSerializer類字段和模型字段有很多是重復(fù)的佳镜,為了保證代碼簡潔僚稿,減少重復(fù), 我們可以類似于Django提供表單(Form)類和模型表單(ModelForm)類相同的方式蟀伸,REST framework也提供了Serializer和ModelSerializer贫奠。下面我們重寫ColumnSerializer類。

class ColumnSerializer(serializers.ModelSerializer):
    class Meta:
        model = Column
        fields = ['name', 'link_url', 'index']

測試結(jié)果和使用

image.png

注意:要記住 ModelSerializer 不做任何格外的配置望蜡,它只是創(chuàng)建序列化類的快捷方式:
1.根據(jù)model里的字段自動定義字段集
2.簡單的實(shí)現(xiàn) create() and update() 方法唤崭,不像使用還要Serializer,自定義create()和update()方法定義了在調(diào)用serializer.save()實(shí)例是如何被創(chuàng)建和修改的脖律。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谢肾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子小泉,更是在濱河造成了極大的恐慌芦疏,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件微姊,死亡現(xiàn)場離奇詭異酸茴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)兢交,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門薪捍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人配喳,你說我怎么就攤上這事酪穿。” “怎么了晴裹?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵被济,是天一觀的道長。 經(jīng)常有香客問我涧团,道長只磷,這世上最難降的妖魔是什么经磅? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮钮追,結(jié)果婚禮上馋贤,老公的妹妹穿的比我還像新娘。我一直安慰自己畏陕,他們只是感情好配乓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惠毁,像睡著了一般犹芹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鞠绰,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天腰埂,我揣著相機(jī)與錄音,去河邊找鬼蜈膨。 笑死屿笼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翁巍。 我是一名探鬼主播驴一,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灶壶!你這毒婦竟也來了肝断?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤驰凛,失蹤者是張志新(化名)和其女友劉穎胸懈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恰响,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趣钱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胚宦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片首有。...
    茶點(diǎn)故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖间唉,靈堂內(nèi)的尸體忽然破棺而出绞灼,到底是詐尸還是另有隱情,我是刑警寧澤呈野,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站印叁,受9級特大地震影響被冒,放射性物質(zhì)發(fā)生泄漏军掂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一昨悼、第九天 我趴在偏房一處隱蔽的房頂上張望蝗锥。 院中可真熱鬧,春花似錦率触、人聲如沸终议。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穴张。三九已至,卻和暖如春两曼,著一層夾襖步出監(jiān)牢的瞬間皂甘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工悼凑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偿枕,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓户辫,卻偏偏與公主長得像渐夸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渔欢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容