DRF之序列化

  • 一竖螃、restframework 序列化組件之 serializers

    from rest_framework import serializers
    from rest_framework.response import Response
    from rest_framework.views import APIView
    
    from app01.models import Book
    
    
    class BookSerializer(serializers.Serializer): # 【自定義一個序列化類】
        title = serializers.CharField(max_length=32) # 【寫哪些字段就序列化哪些】
        price = serializers.DecimalField(max_digits=5, decimal_places=2)
        publish = serializers.CharField(max_length=32)  # 一本書對應(yīng)一個出版社
        publish_email = serializers.CharField(max_length=32, source='publish.email')  # 一本書對應(yīng)一個出版社
        publish_city = serializers.CharField(max_length=32, source='publish.city')  # 一本書對應(yīng)一個出版社
    
        # authors = serializers.CharField(max_length=32)
        # authors = serializers.CharField(max_length=32,source='authors.all')
        # "authors": "<QuerySet [<Author: 張三>, <Author: 王五>]>"
        authors = serializers.SerializerMethodField()
    
        def get_authors(self, obj):
            ret = []  # 這個數(shù)據(jù)類型可根據(jù)前端需求自己構(gòu)建
            for i in obj.authors.all():
                ret.append(i.name)
            return ret
    
    
    class BookView(APIView):
    
        def get(self, request):
            book_list = Book.objects.all()
            bs = BookSerializer(book_list, many=True) # 【序列化接口】
            print(bs.data)  # 【有序字典】
            return Response(bs.data)
    
        def post(self,request): #  請求來了必須先校驗有效性啡邑,才能存入數(shù)據(jù)庫
            bs =BookSerializer(data=request.data)
            print(request.data)  # 【字典】
            print(bs.is_valid())  # 不符合規(guī)范就是False
            if bs.is_valid():  # 【校驗】
                Book.objects.create(**request.data) # 【存庫】
                return Response(bs.data)  # 【返回結(jié)果】
            else:
                return Response(bs.errors) # 【返回錯誤信息】
    

    這樣寫非常多,每一個字段都得自己寫,所以就引出了ModelSerializer,【見 三】

  • 二评凝、序列化過程(GET請求)

    bs = BookSerializer(book_list,many = True)
    bs.data
    temp = []
    for obj in book_list:
        temp.append({
            'title':obj.title,
            'price':obj.price,
            'publish':obj.publish 【此時坯钦,取出來的是個對象,顯示的是此對象中__str__方法的返回值】
                                    所以益咬,設(shè)置外鍵關(guān)聯(lián)的字段也能序列化出來逮诲。
          })
    1,另外:加上source幽告,就會找source里面的梅鹦。可用到外鍵的關(guān)聯(lián)字段里冗锁,點出來一個對象之后再找出對象的屬性齐唆。
          publish = serializers.CharField(max_length=32,source='publish.email')
    2,所以:外鍵的關(guān)聯(lián)對象的任何字段都可以取出冻河。
          publish_email = serializers.CharField(max_length=32,source='publish.email')
          publish_city = serializers.CharField(max_length=32,source='publish.city')
    3箍邮,多對多字段這樣寫會形成這樣的數(shù)據(jù)類型:
          authors = serializers.CharField(max_length=32,source='authors.all')
          "authors": "<QuerySet [<Author: 張三>, <Author: 王五>]>"
    4,所以:多對多字段可以這樣寫:
          authors = serializers,SerializerMethodField()
          def get_authors(self,obj):
              ret = []
              for i in obj.authors.all()
                  ret.append(i.name)
              return ret
    5叨叙,序列化時锭弊,看見是SerializerMethodField類,就會執(zhí)行自定義的get_字段名的方法摔敛。即可解決多對多的顯示問題
          if 字段SerializerMethodField:
           "authors":get_authors(obj)
    
  • 三廷蓉、ModelSerializer 的(get查看)和(post添加)

    from rest_framework import serializers
    from rest_framework.response import Response
    from rest_framework.views import APIView
    
    from app01.models import Book
    
    
    class BookSerializer(serializers.ModelSerializer):
        publish_name = serializers.CharField(max_length=32, source="publish.name", read_only=True)
        publish_city = serializers.CharField(max_length=32, source='publish.city',read_only=True)
        publish_pk=serializers.CharField(max_length=32,source="publish.pk",read_only=True)
    
        author_list = serializers.SerializerMethodField(read_only=True)  # 【規(guī)定只讀】
        def get_author_list(self, obj):
            ret = []  # 這個數(shù)據(jù)類型可根據(jù)前端需求自己構(gòu)建
            for i in obj.authors.all():
                ret.append({'name':i.name,'pk':i.pk})
            return ret
    
        publish_info = serializers.SerializerMethodField(read_only=True)
        def get_publish_info(self, obj):
            return {"name": obj.publish.name, "publish_pk": obj.publish.pk,"publish_city":obj.publish.city}
    
        class Meta:
            model = Book
            # fields = ['title','price']
            fields = '__all__'
            extra_kwargs = {"publish": {"write_only": True}, "authors": {"write_only": True}}#【規(guī)定只寫】
    
    
    class BookView(APIView):
        def get(self, request):
            book_list = Book.objects.all()
            bs = BookSerializer(book_list, many=True)
            return Response(bs.data)
    
        def post(self, request):
            bs = BookSerializer(data=request.data, many=False)
            if bs.is_valid():
                bs.save()  # 【create操作,用ModelSerializer就可直接save】
                return Response(bs.data)
            else:
                return Response(bs.errors)
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子桃犬,更是在濱河造成了極大的恐慌刹悴,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攒暇,死亡現(xiàn)場離奇詭異土匀,居然都是意外死亡,警方通過查閱死者的電腦和手機形用,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門就轧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人田度,你說我怎么就攤上這事妒御。” “怎么了镇饺?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵乎莉,是天一觀的道長。 經(jīng)常有香客問我奸笤,道長惋啃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任监右,我火速辦了婚禮边灭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘健盒。我一直安慰自己绒瘦,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布扣癣。 她就那樣靜靜地躺著椭坚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搏色。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天券册,我揣著相機與錄音频轿,去河邊找鬼。 笑死烁焙,一個胖子當著我的面吹牛航邢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骄蝇,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼膳殷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了九火?” 一聲冷哼從身側(cè)響起赚窃,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤册招,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后勒极,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體是掰,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年辱匿,在試婚紗的時候發(fā)現(xiàn)自己被綠了键痛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡匾七,死狀恐怖絮短,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昨忆,我是刑警寧澤丁频,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站扔嵌,受9級特大地震影響限府,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痢缎,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一胁勺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧独旷,春花似錦署穗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至麻养,卻和暖如春褐啡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鳖昌。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工备畦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人许昨。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓懂盐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親糕档。 傳聞我的和親對象是個殘疾皇子莉恼,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

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

  • 寫在前面: 1. 定義創(chuàng)建序列化類( 子應(yīng)用中俐银,新建 serializers.py) 2. 設(shè)置 隱藏字段 獲取書...
    battleMonkey閱讀 1,194評論 0 1
  • 什么是序列化序列化就是將對象轉(zhuǎn)化為字節(jié)流反序列化就是將字節(jié)流轉(zhuǎn)化為對象 序列化的作用1.將對象保存到磁盤上2.在網(wǎng)...
    sofarsogoo_932d閱讀 209評論 0 0
  • 由于進行通信肯定要涉及數(shù)據(jù)的處理尿背,所以我們需要先了解兩個基礎(chǔ)的概念,序列化和反序列化悉患。 定義 序列化:將對象轉(zhuǎn)化為...
    Eric_feng閱讀 1,138評論 0 1
  • 陽春三月残家,風和日麗,大地復(fù)蘇售躁,掩埋在地下的一切生物坞淮,仿佛睡醒般欣欣然張開了眼,它們憋足了勁兒要鉆出地面陪捷,去...
    兵臨城下n閱讀 149評論 0 0
  • 閱讀回窘,讓我懂得了很多知識;閱讀市袖,帶給我很多快樂啡直;我酷愛閱讀,從小班就一直堅持閱讀苍碟。小朋友們酒觅,讓我們一起愛上閱讀吧!...
    Amy珂賢媽閱讀 126評論 0 0