drf 二

目錄

1.反序列化
2.局部和全局鉤子
3.序列化類常用字段屬性
4.模型序列化全
5.請求對象(了解)
6.響應(yīng)對象屬性(了解)
7.回顧總結(jié)

1.反序列化

1 如果要反序列化,繼承了Serializer轧叽,必須重寫create方法

2 使用
#視圖類
def post(self, request):
    publish_ser = serializer.PublishSerializer(data=request.data)
    if publish_ser.is_valid():
        # 直接保存为居,保存到哪個(gè)表里?需要重寫save
        publish_ser.save()
        return Response(publish_ser.data)
    else:
        
        return Response(publish_ser.error)
    
# 序列化類
def create(self, validated_data):
    res = models.Publish.objects.create(**validated_data)
    return res

2.局部和全局鉤子

def validate_name(self, data):
       # data就是當(dāng)前字段的值
       if data.startswith('sb'):
           raise ValidationError('不能以sb開頭')
       else:
           return data

def validate(self, attrs):
       if attrs.get('name') == attrs.get('city'):
           raise ValidationError('city和名字不能一樣')
       else:
           return attrs

3.序列化類常用字段屬性

3.1 常用和非常用字段

http://www.liuqingzheng.top/python/Django-rest-framework%E6%A1%86%E6%9E%B6/2-drf-%E5%BA%8F%E5%88%97%E5%8C%96%E7%BB%84%E4%BB%B6/

3.2 字段參數(shù)

# 針對charfield
max_length  最大長度
min_lenght  最小長度
allow_blank 是否允許為空
# 針對interfield
max_value   最小值
min_value   最大值

# 通用的页慷,大家都有
#這兩個(gè)最重要
read_only   表明該字段僅用于序列化輸出憔足,默認(rèn)False(序列化)
write_only  表明該字段僅用于反序列化輸入胁附,默認(rèn)False(反序列化)


required    表明該字段在反序列化時(shí)必須輸入,默認(rèn)True
default 反序列化時(shí)使用的默認(rèn)值
allow_null  表明該字段是否允許傳入None滓彰,默認(rèn)False
error_messages  包含錯(cuò)誤編號與錯(cuò)誤信息的字典

validators  該字段使用的驗(yàn)證器(了解)

4.模型序列化全

4.1 視圖類

from rest_framework.views import APIView
from rest_framework.response import Response
from restful import models
from restful import serializer


class BookViews(APIView):
    # 查詢所有
    def get(self, request, *args, **kwargs):
        response = {'status': 200, 'msg': '查詢'}
        try:
            # 取出數(shù)據(jù)庫所有
            book_s = models.Book.objects.all()
            # 序列化全部
            books = serializer.BookModelSerializer(instance=book_s, many=True)  # many全部
            # book.data字典加入到data列表里
            response['data'] = books.data
        except Exception as e:
            # 返回錯(cuò)誤信息
            response['msg'] = str(e)
        return Response(response)

    # 增加
    def post(self, request):
        response = {'status': 200, 'msg': '新增'}
        try:
            # data反序列化
            book_ser = serializer.BookModelSerializer(data=request.data)
            # 校驗(yàn)
            if book_ser.is_valid():
                # 保存
                book_ser.save()
                # book.data字典加入到data列表里
                response['data'] = book_ser.data
            else:
                # book.error錯(cuò)誤信息加入到msg列表里
                response['msg'] = book_ser.errors
        except Exception as e:
            # 返回錯(cuò)誤信息
            response['msg'] = str(e)
        return Response(response)


class BooksViewsId(APIView):
    # 查詢一個(gè)
    def get(self, request, id):
        response = {'status': 200, 'msg': '查詢'}
        try:
            # 取出id
            book_s = models.Book.objects.all().filter(pk=id).first()
            # 序列化
            book_k = serializer.BookModelSerializer(instance=book_s)
            # book.data字典加入到data列表里
            response['data'] = book_k.data
        except Exception as e:
            # 返回錯(cuò)誤信息
            response['msg'] = str(e)
        return Response(response)

    # 修改數(shù)據(jù)
    def put(self, request, id):
        response = {'status': 200, 'msg': '修改'}
        try:
            # 取出id
            books_list = models.Book.objects.all().filter(pk=id).first()
            # 拿到id號反序列化
            book_ser = serializer.BookModelSerializer(instance=books_list, data=request.data)
            # 校驗(yàn)
            if book_ser.is_valid():
                # 保存
                book_ser.save()
                # book.data字典加入到data列表里
                response['data'] = book_ser.data
            else:
                # book.error錯(cuò)誤信息加入到msg列表里
                response['msg'] = book_ser.errors
        except Exception as e:
            # 返回錯(cuò)誤信息
            response['msg'] = str(e)
        return Response(response)
    
    # 刪除
    def delete(self, request, id):
        # 查詢到id號
        res = models.Book.objects.filter(pk=id).delete()
        # 判斷第一個(gè)刪除
        if res[0] > 0:
            return Response('')
        else:
            return Response('刪除的不存在')

4.2 序列化類

from rest_framework import serializers
from restful import models
from rest_framework.exceptions import ValidationError


# 繼承ModelSerializer類
class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        # __all__ 查詢所有
        fields = '__all__'
        # 字段限制
        extra_kwargs = {
            'name': {'max_length': 6, 'required': True},
            'price': {'min_value': 0, 'required': True},
        }

    # 局部鉤子
    def validate_name(self, data):
        # data就是當(dāng)前字段的值
        if data.startswith('sb'):
            raise ValidationError('不能以sb開頭')
        else:
            return data

    # 全局鉤子
    def validate(self, attrs):
        if attrs.get('name') == attrs.get('price'):
            raise ValidationError('名字一樣')
        else:
            return attrs

    # 重寫字段
    publish = serializers.SerializerMethodField()
    # 字段詳情控妻,必須加get_字段名方法
    def get_publish(self, obj):
        return {'name': obj.publish.name, 'city': obj.publish.city}

    #  重寫字段
    authors = serializers.SerializerMethodField()
    # 字段詳情,必須加get_字段名方法
    def get_authors(self, obj):
        return [{'name': author.name, 'age': author.age} for author in obj.authors.all()]

4.3 路由

from restful import views
urlpatterns = [
path('books/<int:id>/', views.BooksViewsId.as_view()),
path('booka/', views.BookViews.as_view()),
]

4.4 settings配置app(注意記得配置數(shù)據(jù)庫也可以用自帶sqllite3)

INSTALLED_APPS = [
    'rest_framework'
]

4.5 models 表(注意遷移)

from django.db import models


class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish_date = models.DateField()

    publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE)
    authors = models.ManyToManyField(to='Author')

    def __str__(self):
        return self.name


class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to='AuthorDatail', to_field='nid', unique=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class AuthorDatail(models.Model):
    nid = models.AutoField(primary_key=True)
    telephone = models.BigIntegerField()
    birthday = models.DateField()
    addr = models.CharField(max_length=64)

    def __str__(self):
        return self.addr


class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

    def __str__(self):
        return self.name

4.6 admin 配置(注意創(chuàng)建用戶 createsuperuser)

from django.contrib import admin
from restful import models


admin.site.register(models.Book)
admin.site.register(models.Author)
admin.site.register(models.AuthorDatail)
admin.site.register(models.Publish)

5.請求對象(了解)

1 Request:新的request
2 常用屬性

1).data
request.data 返回解析之后的請求體數(shù)據(jù)揭绑。類似于Django中標(biāo)準(zhǔn)的request.POST和 request.FILES屬性弓候,但提供如下特性:

包含了解析之后的文件和非文件數(shù)據(jù)
包含了對POST、PUT他匪、PATCH請求方式解析后的數(shù)據(jù)
利用了REST framework的parsers解析器菇存,不僅支持表單類型數(shù)據(jù),也支持JSON數(shù)據(jù)
2).query_params
request.query_params與Django標(biāo)準(zhǔn)的request.GET相同邦蜜,只是更換了更正確的名稱而已

6.響應(yīng)對象屬性(了解)

#一直會(huì)用
data: 為響應(yīng)準(zhǔn)備的序列化處理后的數(shù)據(jù)(字典)
#偶爾會(huì)用
headers: 用于存放響應(yīng)頭信息的字典依鸥;
status: 狀態(tài)碼,默認(rèn)200悼沈;(http請求的狀態(tài)碼)
    
# 基本不用  
template_name: 模板名稱贱迟,如果使用HTMLRenderer 時(shí)需指明姐扮;
content_type: 響應(yīng)數(shù)據(jù)的Content-Type,通常此參數(shù)無需傳遞衣吠,REST framework會(huì)根據(jù)前端所需類型數(shù)據(jù)來設(shè)置該參數(shù)茶敏。

7.回顧總結(jié)

0 drf是django的一個(gè)app
    -序列化器
    -Request
    -Response
    -版本控制
    -認(rèn)證,頻率缚俏,權(quán)限
    -過濾惊搏,排序,分頁
    -視圖相關(guān)
    -自動(dòng)生成接口文檔(coreapi袍榆,swagger)
    -jwt做認(rèn)證(第三方)
    -xadmin---》對admin的美化(bootstrap+jq胀屿,1.x版本),simple-ui
    -RBAC:基于角色的訪問控制(公司內(nèi)部項(xiàng)目)
    
    
1 序列化器
    1. 序列化,序列化器會(huì)把模型對象轉(zhuǎn)換成字典,經(jīng)過response以后變成json字符串
    2. 反序列化,把客戶端發(fā)送過來的數(shù)據(jù),經(jīng)過request以后變成字典,序列化器可以把字典轉(zhuǎn)成模型
    3. 反序列化,完成數(shù)據(jù)校驗(yàn)功能
    
2 Serializer
    -序列化
        -實(shí)例化序列化對象包雀,many參數(shù)作用
        -source
        -SerializerMethodField
        -模型表中寫方法    
    -反序列化
        -ser=BookSerializer(data=request.data)
        -數(shù)據(jù)校驗(yàn):ser.is_valid()
        -存數(shù)據(jù):手動(dòng)存宿崭,重寫B(tài)ookSerializer的create方法,update方法
        -ser.save() 如果是新增才写,會(huì)調(diào)用create葡兑,如果是修改,會(huì)調(diào)用update
        -ser.data 如果有instance對象赞草,就是對instance做序列化
        -全局讹堤,局部鉤子,字段參數(shù)
3 ModelSerializer
    -class Meta:
        model=Book
        fields=‘__all__’
        extra_kwargs
    -重寫某個(gè)字段:跟之前學(xué)的又一樣了
    -子序列化
4 常用非常用字段
5 字段參數(shù)
6 如果第三張表是手動(dòng)建的厨疙,authors是存不進(jìn)去的
    {
    name:ddd
    price:10
    publish:1
    authors:[1,2]
    }
    
7 請求對象的屬性
8 響應(yīng)對象
    -data:響應(yīng)數(shù)據(jù)
    -status:響應(yīng)狀態(tài)碼
    -header:響應(yīng)頭
    -content_type:響應(yīng)類型

9 加入serializer后整個(gè)后端邏輯
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洲守,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沾凄,更是在濱河造成了極大的恐慌梗醇,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撒蟀,死亡現(xiàn)場離奇詭異叙谨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)保屯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門手负,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姑尺,你說我怎么就攤上這事竟终。” “怎么了切蟋?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵统捶,是天一觀的道長。 經(jīng)常有香客問我,道長瘾境,這世上最難降的妖魔是什么歧杏? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮迷守,結(jié)果婚禮上犬绒,老公的妹妹穿的比我還像新娘。我一直安慰自己兑凿,他們只是感情好凯力,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著礼华,像睡著了一般咐鹤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圣絮,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天祈惶,我揣著相機(jī)與錄音,去河邊找鬼扮匠。 笑死捧请,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棒搜。 我是一名探鬼主播疹蛉,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼力麸!你這毒婦竟也來了可款?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤克蚂,失蹤者是張志新(化名)和其女友劉穎闺鲸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陨舱,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翠拣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年版仔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了游盲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛮粮,死狀恐怖益缎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情然想,我是刑警寧澤莺奔,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站变泄,受9級特大地震影響令哟,放射性物質(zhì)發(fā)生泄漏恼琼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一屏富、第九天 我趴在偏房一處隱蔽的房頂上張望晴竞。 院中可真熱鬧,春花似錦狠半、人聲如沸噩死。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽已维。三九已至,卻和暖如春已日,著一層夾襖步出監(jiān)牢的瞬間垛耳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工飘千, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艾扮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓占婉,卻偏偏與公主長得像泡嘴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子逆济,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

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

  • drf使用記錄(二) - 序列化器 簡述 序列化:序列化器會(huì)把模型對象轉(zhuǎn)換成字典,經(jīng)過response以后變成js...
    憧憬001閱讀 716評論 0 0
  • 7. 序列化器-Serializer 作用: 7.1 定義序列化器 Django REST framework中的...
    childhood_1013閱讀 158評論 0 0
  • java面試寶典2018 1酌予、[ meta標(biāo)簽的作用是什么](http://www.wityx.com/post/...
    Sina華閱讀 439評論 1 2
  • 第一部分 Python基礎(chǔ)篇(80題) 1、為什么學(xué)習(xí)Python奖慌? Python相對于其他編程語言有很多優(yōu)點(diǎn): ...
    清清子衿木子水心閱讀 1,716評論 0 1
  • 歡迎關(guān)注公眾號“Tim在路上” 1.聽說你對JVM有點(diǎn)研究抛虫,講一講JVM的內(nèi)存模型吧(我說虛擬機(jī)棧,本地方法棧简僧,程...
    Tim在路上閱讀 3,548評論 4 91