最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

drf序列化器serializer的具體使用

 更新時(shí)間:2021年07月05日 09:52:23   作者:小楊-先生  
本文主要介紹了drf序列化器serializer的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、序列化器-serializer

  • 序列化,序列化器會(huì)把模型對(duì)象轉(zhuǎn)成字典,經(jīng)過(guò)response以后變成JSON字符串
  • 反序列化:把客戶端發(fā)送過(guò)來(lái)的數(shù)據(jù),經(jīng)過(guò)request以后變成字典,序列化器可以把字典轉(zhuǎn)成模型
  • 反序列化:完成數(shù)據(jù)校驗(yàn)功能

二、序列化器的使用

序列化器的使用分為兩個(gè)階段:

  • 在客戶端請(qǐng)求時(shí),使用序列化器可以完成對(duì)數(shù)據(jù)的反序列化。
  • 在服務(wù)器響應(yīng)時(shí),使用序列化器可以完成對(duì)數(shù)據(jù)的序列化。

簡(jiǎn)單使用

1、創(chuàng)建一個(gè)表模型

from django.db import models

class Books(models.Model):
    title = models.CharField(verbose_name='書(shū)名', max_length=32)
    publish = models.CharField(verbose_name='出版社', max_length=32)
    price = models.DecimalField(verbose_name='價(jià)格', max_digits=5, decimal_places=2)

2、新建一個(gè)py文件,寫(xiě)一個(gè)序列化的類,繼承Serializer

3、在類中寫(xiě)要序列化的字段,想序列化那個(gè)字段,就在類中寫(xiě)那個(gè)字段

from rest_framework import serializers

class BooksSerializer(serializers.Serializer):
    title = serializers.CharField()
    publish = serializers.CharField()
    price = serializers.DecimalField()

4、在視圖類中使用,導(dǎo)入——》實(shí)例化得到序列化對(duì)象,把要序列化的對(duì)象傳入

5、序列化的對(duì)象.data——》是一個(gè)字典

6、把字典返回,如果不使用rest_framework提供的Response,就得使用JsonResponse

from rest_framework.views import APIView
from rest_framework.request import Request
from app01.models import Books
from app01.ser import BooksSerializer

class BookView(APIView):
    def get(self, request, pk):
        # 響應(yīng)信息
        response_msg = {'status': 200, 'message': '查詢成功'}
        # 獲取要序列化的對(duì)象
        book = Books.objects.filter(pk=pk).first()
        # 要序列化誰(shuí)就把誰(shuí)傳到序列化類去
        book_ser = BooksSerializer(book)
        # book_ser.data————》序列化對(duì)象.data————》就是序列化后的字典
        # 將查詢結(jié)果添加到響應(yīng)信息內(nèi)
        response_msg['data'] = book_ser.data
        return Response(response_msg)
    
 # urls.py
re_path(r'^book/(?P<pk>\d+)/', views.BookView.as_view()),

7、如果要被序列化的是包含多條數(shù)據(jù)的查詢集queryset,可以通過(guò)添加many=True參數(shù)

from rest_framework.views import APIView
from rest_framework.response import Response
from app01.models import Books
from app01.ser import BooksSerializer


class BooksView(APIView):
    def get(self, request):
        # 響應(yīng)信息
        response_msg = {'status': 200, 'message': '查詢成功'}
        books = Books.objects.all()
        # 要序列化誰(shuí)就把誰(shuí)傳到序列化類去
        book_ser = BooksSerializer(books, many=True)
        # book_ser.data————》序列化對(duì)象.data————》就是序列化后的字典
        # 將查詢結(jié)果添加到響應(yīng)信息內(nèi)
        response_msg['data'] = book_ser.data
        return Response(response_msg)

# urls.py
re_path(r'^books/', views.BookView.as_view()),

高級(jí)使用

source

1、可以修改字段名字

class BooksSerializer(serializers.Serializer):
    xxx = serializers.CharField(source='title')  # 相當(dāng)于——》xxx = Books.title
      
# 響應(yīng)
{
    "status": 200,
    "message": "查詢成功",
    "data": {
        "xxx": "魔道祖師"   ————》響應(yīng)的字段名被修改了
    }
}

2、可以跨表查詢

class BookSerializer(serializers.Serializer):
    publish_email = serializers.CharField(source='publish.email')
    # 相當(dāng)于——》publish_email = Book.publish.email 連表查詢publish表的email字段
    
    
# 響應(yīng)
{
    "status": 200,
    "message": "查詢成功",
    "data": {
        "publish_email": "modao@163.com"
    }
}

3、可以執(zhí)行方法

# models.py
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.IntegerField()
    pub_date = models.DateTimeField()
    publish = models.ForeignKey("Publish", on_delete=models.CASCADE, null=True)
    authors = models.ManyToManyField("Author")

    def func(self):
        return '666666'

    
# ser.py
class BookSerializer(serializers.Serializer):
    msg = serializers.CharField(source='func')
    # msg = Book.func  ——》調(diào)用Book類中的func()方法的返回值
    
    
# 響應(yīng)
{
    "status": 200,
    "message": "查詢成功",
    "data": {
        "msg": "666666"
    }
}

**SerializerMethodField( ) **

它需要有一個(gè)配套的方法,方法名叫做get_字段名,返回值就是要顯示的東西

class BookSerializer(serializers.Serializer):
    authors = serializers.SerializerMethodField()

    def get_authors(self, instance):
        # instance ——》 Book對(duì)象
        authors = instance.authors.all()    # 取出所有作者
        author_list = []
        for author in authors:
            author_list.append({'name': author.name, 'age': author.age})
        return author_list

通用參數(shù)

read_only:(只讀)表明該字段僅用于序列化輸出,默認(rèn)False,如果設(shè)置成True,響應(yīng)中可以看到該字段,修改時(shí),不需要傳該字段

write_only:(只寫(xiě))表明該字段僅用于反序列化輸入,默認(rèn)False,如果設(shè)置成True,響應(yīng)中看不到該字段,修改時(shí),該字段需要傳

from rest_framework import serializers

class BooksSerializer(serializers.Serializer):
    title = serializers.CharField(read_only = True)  # 響應(yīng)中能看到改字段,修改不需要傳值
    publish = serializers.CharField(write_only = True) # 響應(yīng)中看不到改字段,修改需要傳值
    price = serializers.DecimalField()

還有參數(shù)如下:

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

三、反序列化數(shù)據(jù)校驗(yàn)

當(dāng)使用序列化器對(duì)數(shù)據(jù)進(jìn)行反序列化時(shí),就需要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)了,只有校驗(yàn)成功的數(shù)據(jù)才能被保存成模型類對(duì)象

將要校驗(yàn)的數(shù)據(jù)傳入序列化器中并實(shí)例化:obj = BooksSerializer(data=request.data),調(diào)用is_valid()方法校驗(yàn),校驗(yàn)成功返回True,失敗返回False。

失敗,可以通過(guò)序列化器對(duì)象的errors獲取錯(cuò)誤信息(字典)

成功,可以公共序列化對(duì)象的validated_data屬性獲取數(shù)據(jù)。

校驗(yàn)方法有:局部鉤子,全局鉤子,validators,和序列化類型和字段屬性也是

字段屬性

  • max_length  最大長(zhǎng)度
  • min_lenght  最小長(zhǎng)度
  • allow_blank  是否允許為空
  • trim_whitespace 是否截?cái)嗫瞻鬃址?/li>
  • max_value  最小值
  • min_value  最大值

局部鉤子

在序列化器類中創(chuàng)建局部鉤子:validate_字段名,并且接收一個(gè)參數(shù)

# ser.py
class BooksSerializer(serializers.Serializer):
    title = serializers.CharField()
    publish = serializers.CharField()
    price = serializers.DecimalField(max_digits=5, decimal_places=2)
    
    # 局部鉤子對(duì)price字段校驗(yàn)
    def validate_price(self, data):
        if float(data) > 20:
            # 校驗(yàn)成功就通過(guò)
            return data
        else:
            # 校驗(yàn)失敗就拋異常
            raise ValidationError('價(jià)格太低')

全局鉤子

全局鉤子:validate( ), 接收一個(gè)參數(shù),

同時(shí)對(duì)多個(gè)字段進(jìn)行比較驗(yàn)證

# ser.py
class BooksSerializer(serializers.Serializer):
    title = serializers.CharField()
    publish = serializers.CharField()
    price = serializers.DecimalField(max_digits=5, decimal_places=2)
    
def validate(self, validate_data):
    title = validate_data.get('title')
    publish = validate_data.get('publish')
    if not title == publish:
        return validate_data
    else:
        raise ValidationError('書(shū)名和出版社不能一致')

validators

使用字段的validators=[func],來(lái)校驗(yàn)

# ser.py
# 校驗(yàn)函數(shù)
def check_price(data):
    if float(data) > 10:
        return data
    else:
        raise ValidationError('價(jià)格太低')

class BooksSerializer(serializers.Serializer):
    title = serializers.CharField()
    publish = serializers.CharField()
    price = serializers.CharField(validators=[check_price]) # 配置

四、序列化器操作數(shù)據(jù)

查詢所有

# views.py
class BooksView(APIView):
    def get(self, request):
        # 響應(yīng)信息
        response_msg = {'status': 200, 'message': '查詢成功'}
        # 獲取所有數(shù)據(jù)
        books = Books.objects.all()
        # 把數(shù)據(jù)誰(shuí)傳到序列化器中
        book_ser = BooksSerializer(instance=books, many=True) # 序列化多條需要加 many=True
        # book_ser.data————》序列化對(duì)象.data————》就是序列化后的字典
        # 將查詢結(jié)果添加到響應(yīng)信息內(nèi)
        response_msg['data'] = book_ser.data
        return Response(response_msg)
    
# urls.py
path('books/', views.BooksView.as_view()),

查詢單條

# views.py
class BookView(APIView):
    def get(self, request, pk):
        # 響應(yīng)信息
        response_msg = {'status': 200, 'message': '查詢成功'}
        # 獲取要序列化的對(duì)象
        book = Books.objects.filter(pk=pk).first()
        # 要序列化誰(shuí)就把誰(shuí)傳到序列化器中
        book_ser = BooksSerializer(instance=book)
        # book_ser.data————》序列化對(duì)象.data————》就是序列化后的字典
        # 將查詢結(jié)果添加到響應(yīng)信息內(nèi)
        response_msg['data'] = book_ser.data
        return Response(response_msg)
    
# urls.py
re_path(r'^book/(?P<pk>\d+)/', views.BookView.as_view()),

新增數(shù)據(jù)

新增數(shù)據(jù)需要在序列化器中重寫(xiě)create( ) 方法:

注意沒(méi)有傳遞instance實(shí)例,則調(diào)用save()方法的時(shí)候,create()被調(diào)用,相反,如果傳遞了instance實(shí)例,調(diào)用save()方法的時(shí)候,update()被調(diào)用。

# views.py
class BookView(APIView):
    def post(self, request):
        # 響應(yīng)信息
        response_msg = {'status': 201, 'message': '增加成功'}
        # 修改才有instance,新增沒(méi)有instance,只有data
        book_ser = BooksSerializer(data=request.data)

        # 校驗(yàn)字段
        if book_ser.is_valid():
            book_ser.save()  # 需要在序列化器中重寫(xiě)create()方法
            # 保存成功把原數(shù)據(jù)返回
            response_msg['data'] = book_ser.data
        else:
            response_msg['status'] = 202
            response_msg['message'] = '數(shù)據(jù)校驗(yàn)失敗'
            response_msg['data'] = book_ser.error_messages
        return Response(response_msg)
    
    
# ser.py
class BooksSerializer(serializers.Serializer):
    title = serializers.CharField()
    publish = serializers.CharField()
    price = serializers.DecimalField(max_digits=5, decimal_places=2)

    # 重寫(xiě)create
    def create(self, validated_data):   # validated_data——>傳入的新增數(shù)據(jù)
        instance = Books.objects.create(**validated_data)
        # instance——> 新增的字段對(duì)象,需要返回
        return instance
       
# urls.py
path('book/', views.BookView.as_view()),

修改數(shù)據(jù)

修改數(shù)據(jù)需要在序列化器中重寫(xiě)update( ) 方法:

# views.py
class BookView(APIView):
    def put(self, request, pk):
        # 響應(yīng)信息
        response_msg = {'status': 200, 'message': '修改成功'}
        # 獲取需要修改的字段對(duì)象
        book = Books.objects.filter(pk=pk).first()
        # 將字段對(duì)象和修改數(shù)據(jù)添加到序列化器中
        book_ser = BooksSerializer(instance=book, data=request.data)

        # 校驗(yàn)數(shù)據(jù)
        if book_ser.is_valid():
            book_ser.save()     # 需要在序列化器中重寫(xiě)update()方法
            response_msg['data'] = book_ser.data
        else:
            response_msg['status'] = 202
            response_msg['message'] = '數(shù)據(jù)校驗(yàn)失敗'
            response_msg['data'] = book_ser.error_messages
        return Response(response_msg)
    
# urls.py
re_path('book/(?P<pk>\d+)', views.BookView.as_view()),

刪除數(shù)據(jù)

# views.py
class BooksView(APIView):
    def delete(self, request, pk):
    # 響應(yīng)信息
    response_msg = {'status': 200, 'message': '刪除成功'}
    # 刪除數(shù)據(jù)
    Books.objects.filter(pk=pk).delete()
    return Response(response_msg)
    
# urls.py
re_path('book/(?P<pk>\d+)', views.BooksView.as_view()),

五、模型類序列化器

DRF提供了ModelSerializer模型類序列化器來(lái)幫助我們快速創(chuàng)建一個(gè)Serializer類。

ModelSerializer與常規(guī)的Serializer相同,但是提供了:

  • 基于模型類自動(dòng)生成一系列字段
  • 基于模型類自動(dòng)為Serializer生成validators,比如unique_together
  • 包含默認(rèn)的create( ) 和update( )。

實(shí)例:

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book        # 指明參照那個(gè)模型類
        fields = '__all__'  # 為模型類的那些字段生成

字段操作

1、可以使用fields來(lái)明確字段,__all__表示包含所以字段,具體那些字段->fields = ('title','price')

2、exclude表示排除那些字段,不能和fields一起寫(xiě)——>exclude = ('price',)

3、額外參數(shù)extra_kwargs,給字段添加額外的參數(shù)

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book        # 指明參照那個(gè)模型類
        fields = '__all__'  # 為模型類的那些字段生成
  
        # 類似于  title = serializers.CharField(read_only = True)
        extra_kwargs = {
            'title': {'read_only': True},
        }

六、源碼分析many=True

當(dāng)我們需要查詢多條數(shù)據(jù)時(shí)就需要在實(shí)例化序列化器的時(shí)候傳many=True

book_ser = BooksSerializer(instance=books, many=True) # 查詢多條
book_one_ser = BooksSerializer(instance=book) # 查詢單條

print(type(book_ser))
#<class 'rest_framework.serializers.ListSerializer'>

print(type(book_one_ser))
#<class 'app01.ser.BookModelSerializer'>

# 對(duì)象的生成-->先調(diào)用類的__new__方法,生成空對(duì)象,如果many=True,生成ListSerializer對(duì)象,反之生成Serializer對(duì)象

# 類的__new__方法控制對(duì)象的生成
def __new__(cls, *args, **kwargs):
    # 如果many=True,就會(huì)自動(dòng)創(chuàng)建ListSerializer類
    if kwargs.pop('many', False):
        return cls.many_init(*args, **kwargs)
    return super().__new__(cls, *args, **kwargs)

到此這篇關(guān)于drf序列化器serializer的具體使用的文章就介紹到這了,更多相關(guān)drf序列化器serializer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python使用re模塊實(shí)現(xiàn)okenizer(表達(dá)式分詞器)

    Python使用re模塊實(shí)現(xiàn)okenizer(表達(dá)式分詞器)

    這篇文章主要介紹了Python使用re模塊實(shí)現(xiàn)okenizer,我們這里講解用正則表達(dá)式構(gòu)建簡(jiǎn)單的表達(dá)式分詞器(tokenizer),它能夠?qū)⒈磉_(dá)式字符串從左到右解析為標(biāo)記(tokens)流,需要的朋友可以參考下
    2022-04-04
  • 舉例講解Python裝飾器

    舉例講解Python裝飾器

    這篇文章主要介紹了Python裝飾器的相關(guān)資料,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Python實(shí)現(xiàn)圖形用戶界面和游戲開(kāi)發(fā)的方法和技巧

    Python實(shí)現(xiàn)圖形用戶界面和游戲開(kāi)發(fā)的方法和技巧

    GUI圖形用戶界面編程,我們可以通過(guò)python提供的豐富的組件,快速的實(shí)現(xiàn)使用圖形的界面和用戶交互, GUI編程類似于“搭積?”,將?個(gè)個(gè)組件(Widget)放到窗?中,這篇文章主要給大家介紹了基于Python的GUI圖形用戶界面編程的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • python挖礦算力測(cè)試程序詳解

    python挖礦算力測(cè)試程序詳解

    這篇文章主要介紹了python挖礦算力測(cè)試程序詳解的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 在Python中使用xlrd和xlwt讀寫(xiě)Excel文件代碼實(shí)例

    在Python中使用xlrd和xlwt讀寫(xiě)Excel文件代碼實(shí)例

    這篇文章主要介紹了在Python中使用xlrd和xlwt讀寫(xiě)Excel文件代碼實(shí)例,python操作excel主要用到xlrd和xlwt兩個(gè)庫(kù),即xlrd是讀excel,xlwt是寫(xiě)excel庫(kù),文中提供了部分實(shí)例代碼,需要的朋友可以參考下
    2023-08-08
  • pycharm自定義TODO類注釋以及高亮顏色的設(shè)置方法

    pycharm自定義TODO類注釋以及高亮顏色的設(shè)置方法

    這篇文章主要介紹了pycharm自定義TODO類注釋以及高亮顏色的設(shè)置方法,文中通過(guò)圖文結(jié)合的方式給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-03-03
  • PIP安裝python包出現(xiàn)超時(shí)問(wèn)題的解決

    PIP安裝python包出現(xiàn)超時(shí)問(wèn)題的解決

    這篇文章主要介紹了PIP安裝python包出現(xiàn)超時(shí)問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python日期相關(guān)操作實(shí)例小結(jié)

    python日期相關(guān)操作實(shí)例小結(jié)

    這篇文章主要介紹了python日期相關(guān)操作,結(jié)合實(shí)例形式總結(jié)分析了Python針對(duì)日期時(shí)間的獲取、轉(zhuǎn)換、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • python根據(jù)給定文件返回文件名和擴(kuò)展名的方法

    python根據(jù)給定文件返回文件名和擴(kuò)展名的方法

    這篇文章主要介紹了python根據(jù)給定文件返回文件名和擴(kuò)展名的方法,實(shí)例分析了Python操作文件及字符串的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 使用pycallgraph分析python代碼函數(shù)調(diào)用流程以及框架解析

    使用pycallgraph分析python代碼函數(shù)調(diào)用流程以及框架解析

    這篇文章主要介紹了使用pycallgraph分析python代碼函數(shù)調(diào)用流程以及框架解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論

石狮市| 桂东县| 定陶县| 谷城县| 越西县| 弥勒县| 丘北县| 阳曲县| 会昌县| 阳新县| 福安市| 集贤县| 文水县| 安阳县| 陵水| 礼泉县| 同江市| 仪陇县| 江西省| 大石桥市| 长沙市| 湛江市| 营山县| 邵阳县| 射洪县| 明水县| 察雅县| 岱山县| 万宁市| 会昌县| 新郑市| 平顺县| 虎林市| 溧阳市| 九江县| 交口县| 安溪县| 沈阳市| 邯郸市| 望江县| 平定县|