国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Django REST framework中的序列化Serializers

這篇具有很好參考價(jià)值的文章主要介紹了Django REST framework中的序列化Serializers。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

序列化器允許將諸如查詢集和模型實(shí)例之類的復(fù)雜數(shù)據(jù)轉(zhuǎn)換為原生 Python 數(shù)據(jù)類型,然后可以將它們輕松地呈現(xiàn)為 JSON,XML 或其他內(nèi)容類型。序列化器還提供反序列化,在首次驗(yàn)證傳入數(shù)據(jù)之后,可以將解析的數(shù)據(jù)轉(zhuǎn)換回復(fù)雜類型。
簡(jiǎn)單來(lái)說(shuō),服務(wù)器通過(guò)api 返回?cái)?shù)據(jù)(json格式),把非json格式轉(zhuǎn)換為json 就是序列化的過(guò)程
瀏覽器提交給服務(wù)器端的數(shù)據(jù),服務(wù)端將json 格式轉(zhuǎn)換給非json存儲(chǔ)到數(shù)據(jù)庫(kù),就是反序列化

REST framework 中的序列化類與 Django 的 Form 和 ModelForm 類非常相似。我們提供了一個(gè) Serializer 類,它提供了一種強(qiáng)大的通用方法來(lái)控制響應(yīng)的輸出,以及一個(gè) ModelSerializer 類,它為創(chuàng)建處理模型實(shí)例和查詢集的序列化提供了有效的快捷方式。

1、申明序列化類

首先創(chuàng)建一個(gè)簡(jiǎn)單的對(duì)象用于示例:

from datetime import datetime
class Comment(object):
    def __init__(self, email, content, created=None):
        self.email = email
        self.content = content
        self.created = created or datetime.now()
comment = Comment(email='leila@example.com', content='foo bar')

聲明一個(gè)序列化類,使用它來(lái)序列化和反序列化與 Comment 對(duì)象相對(duì)應(yīng)的數(shù)據(jù)
聲明一個(gè)序列化類看起來(lái)非常類似于聲明一個(gè)表單:

from rest_framework import serializers
class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

2、序列化對(duì)象

現(xiàn)在可以使用 CommentSerializer 來(lái)序列化評(píng)論或評(píng)論列表。同樣,使用 Serializer 類看起來(lái)很像使用 Form 類。

serializer = CommentSerializer(comment)
serializer.data
# {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2016-01-27T15:17:10.375877'}

此時(shí)已經(jīng)將模型實(shí)例轉(zhuǎn)換為 Python 原生數(shù)據(jù)類型。為了完成序列化過(guò)程,將數(shù)據(jù)渲染為 json。

from rest_framework.renderers import JSONRenderer
json = JSONRenderer().render(serializer.data)
json
# b'{"email":"leila@example.com","content":"foo bar","created":"2016-01-27T15:17:10.375877"}'

3、反序列化對(duì)象

反序列化是相似的。首先我們將一個(gè)流解析為 Python 原生數(shù)據(jù)類型…

from django.utils.six import BytesIO
from rest_framework.parsers import JSONParser
stream = BytesIO(json)
data = JSONParser().parse(stream)

然后我們將這些原生數(shù)據(jù)類型恢復(fù)成通過(guò)驗(yàn)證的數(shù)據(jù)字典。

serializer = CommentSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
# {'content': 'foo bar', 'email': 'leila@example.com', 'created': datetime.datetime(2012, 08, 22, 16, 20, 09, 822243)}

4、保存實(shí)例

如果希望能夠基于驗(yàn)證的數(shù)據(jù)返回完整的對(duì)象實(shí)例,則需要實(shí)現(xiàn) .create() 和 .update() 方法中的一個(gè)或兩個(gè)。例如:

class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()
    def create(self, validated_data):
        return Comment(**validated_data)
    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.content = validated_data.get('content', instance.content)
        instance.created = validated_data.get('created', instance.created)
        return instance

如果對(duì)象實(shí)例與 Django 模型相對(duì)應(yīng),還需要確保這些方法將對(duì)象保存到數(shù)據(jù)庫(kù)。如果 Comment 是一個(gè) Django 模型,這些方法可能如下所示:

 def create(self, validated_data):
        return Comment.objects.create(**validated_data)
    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.content = validated_data.get('content', instance.content)
        instance.created = validated_data.get('created', instance.created)
        instance.save()
        return instance

現(xiàn)在,當(dāng)反序列化數(shù)據(jù)時(shí),我們可以調(diào)用 .save() 根據(jù)驗(yàn)證的數(shù)據(jù)返回一個(gè)對(duì)象實(shí)例。

comment = serializer.save()

調(diào)用 .save() 將創(chuàng)建一個(gè)新實(shí)例或更新現(xiàn)有實(shí)例,具體取決于在實(shí)例化序列化類時(shí)是否傳遞了現(xiàn)有實(shí)例:

# .save() will create a new instance.
serializer = CommentSerializer(data=data)
# .save() will update the existing `comment` instance.
serializer = CommentSerializer(comment, data=data)

.create() 和 .update() 方法都是可選的。您可以都不實(shí)現(xiàn),或者實(shí)現(xiàn)其中的一個(gè)或兩個(gè),具體取決于你的序列化類的用例。

將附加屬性傳遞給 .save()

有時(shí)你會(huì)希望你的視圖代碼能夠在保存實(shí)例的時(shí)候注入額外的數(shù)據(jù)。這些附加數(shù)據(jù)可能包含當(dāng)前用戶,當(dāng)前時(shí)間或其他任何不屬于請(qǐng)求數(shù)據(jù)的信息。

serializer.save(owner=request.user)

調(diào)用 .create() 或 .update() 時(shí),任何其他關(guān)鍵字參數(shù)都將包含在 validated_data 參數(shù)中。

直接覆蓋 .save()。

在某些情況下,.create() 和 .update() 方法名稱可能沒(méi)有意義。例如,在 “聯(lián)系人表單” 中,我們可能不會(huì)創(chuàng)建新實(shí)例,而是發(fā)送電子郵件或其他消息。

在這些情況下,可以選擇直接覆蓋 .save(),因?yàn)樗呖勺x性和有意義性。

舉個(gè)例子:

class ContactForm(serializers.Serializer):
    email = serializers.EmailField()
    message = serializers.CharField()
    def save(self):
        email = self.validated_data['email']
        message = self.validated_data['message']
        send_email(from=email, message=message)

請(qǐng)注意,在上面的情況下,必須直接訪問(wèn) serializer .validated_data 屬性。

5、驗(yàn)證

在反序列化數(shù)據(jù)時(shí),你總是需要在嘗試訪問(wèn)驗(yàn)證數(shù)據(jù)之前調(diào)用 is_valid(),或者保存對(duì)象實(shí)例。如果發(fā)生任何驗(yàn)證錯(cuò)誤,那么 .errors 屬性將包含一個(gè)代表錯(cuò)誤消息的字典。例如:

serializer = CommentSerializer(data={'email': 'foobar', 'content': 'baz'})
serializer.is_valid()
# False
serializer.errors
# {'email': [u'Enter a valid e-mail address.'], 'created': [u'This field is required.']}

字典中的每個(gè)鍵都是字段名稱,值是與該字段相對(duì)應(yīng)的錯(cuò)誤消息(字符串列表)。non_field_errors 鍵也可能存在,并會(huì)列出任何常規(guī)驗(yàn)證錯(cuò)誤??梢允褂?NON_FIELD_ERRORS_KEY (在 settings 文件中設(shè)置)來(lái)定制 non_field_errors 關(guān)鍵字的名稱。

反序列化 item 列表時(shí),錯(cuò)誤將作為代表每個(gè)反序列化 item 的字典列表返回。

數(shù)據(jù)驗(yàn)證時(shí)拋出異常
.is_valid() 方法帶有一個(gè)可選的 raise_exception 標(biāo)志,如果存在驗(yàn)證錯(cuò)誤,將導(dǎo)致它引發(fā) serializers.ValidationError 異常。
這些異常由 REST framework 提供的默認(rèn)異常處理程序自動(dòng)處理,并且默認(rèn)情況下將返回 HTTP 400 Bad Request

# Return a 400 response if the data was invalid.
serializer.is_valid(raise_exception=True)

字段級(jí)驗(yàn)證
你可以通過(guò)向 Serializer 子類添加 .validate_<field_name> 方法來(lái)指定自定義字段級(jí)驗(yàn)證。這些與 Django 表單上的 .clean_<field_name> 方法類似。
這些方法只有一個(gè)參數(shù),就是需要驗(yàn)證的字段值。

您的 validate_<field_name> 方法應(yīng)返回驗(yàn)證值或引發(fā) serializers.ValidationError。

from rest_framework import serializers
class BlogPostSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=100)
    content = serializers.CharField()
    def validate_title(self, value):
        """
        Check that the blog post is about Django.
        """
        if 'django' not in value.lower():
            raise serializers.ValidationError("Blog post is not about Django")
        return value

對(duì)象級(jí)驗(yàn)證
如果要對(duì)多個(gè)字段進(jìn)行其他的驗(yàn)證,請(qǐng)將一個(gè)名為 .validate() 的方法添加到您的 Serializer 子類中。這個(gè)方法只有一個(gè)參數(shù),它是一個(gè)字段值(field-value)的字典。如果有必要,它應(yīng)該引發(fā)一個(gè) ValidationError,或者只是返回驗(yàn)證的值。例如:

from rest_framework import serializers
class EventSerializer(serializers.Serializer):
    description = serializers.CharField(max_length=100)
    start = serializers.DateTimeField()
    finish = serializers.DateTimeField()
    def validate(self, data):
        """
        Check that the start is before the stop.
        """
        if data['start'] > data['finish']:
            raise serializers.ValidationError("finish must occur after start")
        return data

驗(yàn)證器
序列化器上的各個(gè)字段可以包含驗(yàn)證器,方法是在字段實(shí)例上聲明它們,例如:

def multiple_of_ten(value):
    if value % 10 != 0:
        raise serializers.ValidationError('Not a multiple of ten')
class GameRecord(serializers.Serializer):
    score = IntegerField(validators=[multiple_of_ten])
    ...

序列化類還可以包含應(yīng)用于整個(gè)字段數(shù)據(jù)集的可重用驗(yàn)證器。這些驗(yàn)證器是通過(guò)在內(nèi)部的 Meta 類中聲明它們來(lái)包含的,如下所示:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-706636.html

class EventSerializer(serializers.Serializer):
    name = serializers.CharField()
    room_number = serializers.IntegerField(choices=[101, 102, 103, 201])
    date = serializers.DateField()
    class Meta:
        # Each room only has one event per day.
        validators = UniqueTogetherValidator(
            queryset=Event.objects.all(),
            fields=['room_number', 'date']
        )

到了這里,關(guān)于Django REST framework中的序列化Serializers的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Django學(xué)習(xí)】(十)模型序列化器_關(guān)聯(lián)字段序列化

    【Django學(xué)習(xí)】(十)模型序列化器_關(guān)聯(lián)字段序列化

    這篇文章是針對(duì)模型類序列化器以及如何關(guān)聯(lián)字段序列化 進(jìn)行深入講解的; ?在上面的模型序列化類中: 可以繼承ModelSerializer類或者M(jìn)odelSerializer的子類,來(lái)創(chuàng)建模型序列化器類; 模型序列化器類中可以重新定義序列化器字段,優(yōu)先級(jí)大于自動(dòng)生成的同名字段 如果新定義的字

    2024年02月11日
    瀏覽(21)
  • 【django2.0之Rest_Framework框架一】rest_framework序列器介紹

    Django RestFramework(簡(jiǎn)稱DRF) 提供了序列化器Serialzier的定義,可以幫助我們簡(jiǎn)化序列化與反序列化的過(guò)程,不僅如此,還提供豐富的類視圖、擴(kuò)展類、視圖集來(lái)簡(jiǎn)化視圖的編寫工作。REST framework還提供了認(rèn)證、權(quán)限、限流、過(guò)濾、分頁(yè)、接口文檔等功能支持。 github地址: https://

    2024年02月07日
    瀏覽(27)
  • 【Django】Task4 序列化及其高級(jí)使用、ModelViewSet

    【Django】Task4 序列化及其高級(jí)使用、ModelViewSet

    Task4主要了解序列化及掌握其高級(jí)使用,了解ModelViewSet的作用,ModelViewSet 是 Django REST framework(DRF)中的一個(gè)視圖集類,用于快速創(chuàng)建處理模型數(shù)據(jù)的 API 視圖。 Django 的序列化是指將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(通常是數(shù)據(jù)庫(kù)中的模型對(duì)象)轉(zhuǎn)換為可以在不同應(yīng)用程序間傳輸和存儲(chǔ)的格

    2024年02月11日
    瀏覽(20)
  • java中的序列化和反序列化

    objectOutputStream 對(duì)象的序列化,以流的形式將對(duì)象寫入文件 構(gòu)造方法: objectOutputStream(OutputStream out) 傳入一個(gè)字節(jié)輸入流創(chuàng)建objectOutputStream對(duì)象 成員方法: void writeObject(object obj) 將指定的對(duì)象寫入objectOutputStream 使用步驟: 創(chuàng)建一個(gè)類,這個(gè)類實(shí)現(xiàn)Serializable接口,Serializable是一

    2024年02月14日
    瀏覽(19)
  • 由Django-Session配置引發(fā)的反序列化安全問(wèn)題

    漏洞成因位于目標(biāo)配置文件settings.py下 關(guān)于這兩個(gè)配置項(xiàng) SESSION_ENGINE: 在Django中, SESSION_ENGINE ?是一個(gè)設(shè)置項(xiàng),用于指定用于存儲(chǔ)和處理會(huì)話(session)數(shù)據(jù)的引擎。 SESSION_ENGINE ?設(shè)置項(xiàng)允許您選擇不同的后端引擎來(lái)存儲(chǔ)會(huì)話數(shù)據(jù),例如: 數(shù)據(jù)庫(kù)后端 ?( django.contrib.sessions.b

    2024年02月08日
    瀏覽(21)
  • Django實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(九)環(huán)境envs序列化器及視圖【持續(xù)更新中】

    Django實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(九)環(huán)境envs序列化器及視圖【持續(xù)更新中】

    相關(guān)文章: Django實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(八)測(cè)試報(bào)告reports序列化器及視圖【持續(xù)更新中】_做測(cè)試的喵醬的博客-CSDN博客 本章是項(xiàng)目的一個(gè)分解,查看本章內(nèi)容時(shí),要結(jié)合整體項(xiàng)目代碼來(lái)看: python django vue httprunner 實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(最終版)_python+vue自動(dòng)化測(cè)試平臺(tái)_做測(cè)

    2024年02月16日
    瀏覽(21)
  • Django實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(十一)項(xiàng)目模塊Projects序列化器及視圖【持續(xù)更新中】

    Django實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(十一)項(xiàng)目模塊Projects序列化器及視圖【持續(xù)更新中】

    相關(guān)文章: Django實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(十)自定義action names【持續(xù)更新中】_做測(cè)試的喵醬的博客-CSDN博客 本章是項(xiàng)目的一個(gè)分解,查看本章內(nèi)容時(shí),要結(jié)合整體項(xiàng)目代碼來(lái)看: python django vue httprunner 實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(最終版)_python+vue自動(dòng)化測(cè)試平臺(tái)_做測(cè)試的喵醬的博

    2024年02月16日
    瀏覽(45)
  • Django實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(八)測(cè)試報(bào)告reports序列化器及視圖【持續(xù)更新中】

    上一章: Django實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(七)數(shù)據(jù)庫(kù)設(shè)計(jì)_做測(cè)試的喵醬的博客-CSDN博客 下一章: 官方文檔: Serializers - Django REST framework apps/reports/serializers.py 1.1.1 代碼解釋: 1、? exclude: You can set the? exclude ?attribute to a list of fields to be excluded from the serializer. For example: 2、read_o

    2024年02月09日
    瀏覽(19)
  • Django實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(十三)接口模塊Interfaces序列化器及視圖【持續(xù)更新中】

    Django實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(十三)接口模塊Interfaces序列化器及視圖【持續(xù)更新中】

    相關(guān)文章: Django實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(十二)自定義函數(shù)模塊DebugTalks 序列化器及視圖【持續(xù)更新中】_做測(cè)試的喵醬的博客-CSDN博客 本章是項(xiàng)目的一個(gè)分解,查看本章內(nèi)容時(shí),要結(jié)合整體項(xiàng)目代碼來(lái)看: python django vue httprunner 實(shí)現(xiàn)接口自動(dòng)化平臺(tái)(最終版)_python+vue自動(dòng)化測(cè)

    2024年02月17日
    瀏覽(15)
  • 談?wù)刲inux網(wǎng)絡(luò)編程中的應(yīng)用層協(xié)議定制、Json序列化與反序列化那些事

    談?wù)刲inux網(wǎng)絡(luò)編程中的應(yīng)用層協(xié)議定制、Json序列化與反序列化那些事

    由于socket api的接口,在讀寫數(shù)據(jù)的時(shí)候是以字符串的方式發(fā)送接收的,如果需要傳輸 結(jié)構(gòu)化的數(shù)據(jù) ,就需要制定一個(gè)協(xié)議 結(jié)構(gòu)化數(shù)據(jù)在發(fā)送到網(wǎng)絡(luò)中之前需要完成序列化 接收方收到的是序列字節(jié)流,需要完成反序列化才能使用(如ChatInfo._name) 當(dāng)我們進(jìn)行網(wǎng)絡(luò)通信的的時(shí)

    2024年02月06日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包