DRF之序列化

  • 序列化

把Python中對象轉換為json格式字符串

  • 反序列化

把json格式轉為為Python對象腋舌。

  • 序列化兩大功能:

對請求數(shù)據(jù)進行驗證
對Queryset對象進行序列化

rest framework序列化之Serializer

  • 建表 models.py
from django.db import models


class Book(models.Model):
    title=models.CharField(max_length=32)
    price=models.IntegerField()
    pub_date=models.DateField()
    publish=models.ForeignKey("Publish")
    authors=models.ManyToManyField("Author")
    def __str__(self):
        return self.title

class Publish(models.Model):
    name=models.CharField(max_length=32)
    email=models.EmailField()
    def __str__(self):
        return self.name

class Author(models.Model):
    name=models.CharField(max_length=32)
    age=models.IntegerField()
    def __str__(self):
        return self.name
  • views

寫一個restframework接口拿到數(shù)據(jù)(所有圖書)
方式一:如果沒有序列化組件的話,要先轉成字典烤蜕,然后再用json.dumps()再轉卖子。
方式二:用序列化組件斩萌。
首先你要序列化誰玻褪,先寫一個類。這個類繼承一個東西房蝉,然后用的時候僚匆,在視圖類中直接用這個類生成一個對象。

from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response


from api import models

# 想用這個類搭幻,需要導入
from api.MySerializer import BookSerializer

class BookView(APIView):

    def get(self,request,*args,**kwargs):
        ret = {
            'code':100,
            'msg':'成功了'
        }
        books = models.Book.objects.all()
        # 第一個參數(shù)是要序列化的對象咧擂,如果序列化多條,必須指定many=True
        books_ser = BookSerializer(instance=books,many=True)
        # 當序列化的對象是單個對象的時候many=False book = models.Book.objects.all().first()
        # books_ser.data  就是序列化后的結果 是個字典
        print(books_ser.data)
        ret['books']=books_ser.data
        # return Response(books_ser.data)
        return Response(ret)
  • 寫的格式化的類在另外的文件夾或文件:
# 自己寫一個序列化的類
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
    # 序列化哪個字段,必須跟數(shù)據(jù)庫字段一樣檀蹋,都想序列化就一個一個排著寫
    id = serializers.CharField()
    title = serializers.CharField()
    price = serializers.CharField()

ModelSerializer

'''
基于ModelSerializer的序列化器
'''

from rest_framework import serializers
from SerDemo.models import Book

class BookSerializer(serializers.ModelSerializer):
    # SerializerMethodField() 方法字段松申,返回值是該字段方法的返回值
    # SerializerMethodField() 一般用于正序列化
    newcategory = serializers.SerializerMethodField(read_only=True)
    newpublisher = serializers.SerializerMethodField(read_only=True)
    newauthors = serializers.SerializerMethodField(read_only=True)

    # 字段方法,必須有obj參數(shù),返回值給category_text字段
    def get_newcategory(self,obj):
        return obj.get_category_display()

    # 外鍵關系的展示方法
    def get_newpublisher(self,obj):
        return {"id":obj.publisher_id,"title":obj.publisher.title}

    # 多對多關系的展示方法
    def get_newauthors(self,obj):
        return [{"id":author.id,"name":author.name} for author in obj.authors.all()]

    class Meta:
        model = Book        # 序列化的模型
        fields = "__all__"  # 序列化所有字段

        # fields = ['id','title']   序列化列表內的字段
        # exclude = ['publisher','authors']     序列化模型內排除列表內的字段
        # depth = 1       根據(jù)外鍵關系往內找1層俯逾,但所有的外鍵都變成read_only = True

        # 給原來的字段添加屬性
        extra_kwargs = {
            "category":{"write_only":True},     # 字段: {參數(shù):參數(shù)值}
            "publisher":{"write_only":True},
            "authors":{"write_only":True},
        }
from utils.model_serializers import BookSerializer       # 導入序列化組件
from .models import Book
from rest_framework.views import APIView
from rest_framework.response import Response

class BookView(APIView):
    def get(self,request):
        # 找到所有的模型對象
        book_queryset = Book.objects.all()

        # 對模型對象進行序列化贸桶,返回序列化對象
        ser_obj = BookSerializer(book_queryset,many=True)       # 多個模型對象使用many=True
        return Response(ser_obj.data)

    def post(self,request):
        # 將前端獲取的數(shù)據(jù),返回序列化對象
        ser_obj = BookSerializer(data=request.data)

        # 對序列化對象進行校驗
        if ser_obj.is_valid():
            # 校驗通過桌肴,創(chuàng)建對象
            ser_obj.save()
            return Response(ser_obj.data)   # 返回新增的對象
        else:
            return Response(ser_obj.errors) # 返回錯誤信息

# 帶id的查詢皇筛、更新、刪除
class EditBookView(APIView):
    # 根據(jù)id查看數(shù)據(jù)
    def get(self,request,id):
        # 根據(jù)ip找到模型對象
        book_obj = Book.objects.filter(pk=id).first()

        # 對模型對象進行序列化识脆,返回序列化對象
        ser_obj = BookSerializer(book_obj)

        # 返回序列化對象的數(shù)據(jù)
        return Response(ser_obj.data)

    # 根據(jù)id更新數(shù)據(jù)
    def put(self,request,id):
        # 根據(jù)ip找到模型對象
        book_obj = Book.objects.filter(pk=id).first()

        # 將獲取的數(shù)據(jù)根據(jù)模型對象進行序列化设联,返回序列化對象
        ser_obj = BookSerializer(instance=book_obj,data=request.data,partial=True)
        # partial=True 部分匹配
        # data=request.data 前端提交的數(shù)據(jù)
        # instance=book_obj根據(jù)id找到的實例化對象

        # 對實例化對象進行校驗
        if ser_obj.is_valid():
            # 校驗通過,調用save進行更新
            ser_obj.save()      # 內部調用序列化器的update方法
            return Response(ser_obj.data)
        else:
            return Response(ser_obj.errors)     # 返回錯誤信息

    # 根據(jù)id刪除數(shù)據(jù)
    def delete(self,request,id):
        # 根據(jù)ip找到模型對象
        book_obj = Book.objects.filter(pk=id).first()

        if book_obj:
            book_obj.delete()
            return Response("刪除成功")
        else:
            return Response("刪除失敗")
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灼捂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌换团,老刑警劉巖悉稠,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異艘包,居然都是意外死亡的猛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門想虎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卦尊,“玉大人,你說我怎么就攤上這事舌厨∑袢矗” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長躏哩。 經(jīng)常有香客問我署浩,道長,這世上最難降的妖魔是什么扫尺? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任筋栋,我火速辦了婚禮,結果婚禮上正驻,老公的妹妹穿的比我還像新娘弊攘。我一直安慰自己,他們只是感情好姑曙,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布肴颊。 她就那樣靜靜地躺著,像睡著了一般渣磷。 火紅的嫁衣襯著肌膚如雪婿着。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天醋界,我揣著相機與錄音竟宋,去河邊找鬼。 笑死形纺,一個胖子當著我的面吹牛丘侠,可吹牛的內容都是我干的。 我是一名探鬼主播逐样,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蜗字,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脂新?” 一聲冷哼從身側響起挪捕,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎争便,沒想到半個月后级零,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡滞乙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年奏纪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斩启。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡序调,死狀恐怖,靈堂內的尸體忽然破棺而出兔簇,到底是詐尸還是另有隱情发绢,我是刑警寧澤硬耍,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站朴摊,受9級特大地震影響默垄,放射性物質發(fā)生泄漏。R本人自食惡果不足惜甚纲,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一口锭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧介杆,春花似錦鹃操、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赴背,卻和暖如春椰拒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凰荚。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工燃观, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人便瑟。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓缆毁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親到涂。 傳聞我的和親對象是個殘疾皇子脊框,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內容