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

Django框架序列化與反序列化操作詳解

 更新時(shí)間:2019年11月01日 11:26:00   作者:HMMHMH  
這篇文章主要介紹了Django框架序列化與反序列化操作,結(jié)合實(shí)例形式詳細(xì)分析了Django框架Serializer類操作對(duì)象序列化及反序列化相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下

本文實(shí)例講述了Django框架序列化與反序列化操作。分享給大家供大家參考,具體如下:

Serializer類

1.定義:

Django REST framework中的Serializer使用類來(lái)定義,須繼承rest_framework.serializers.Serializer。

例:

class BookInfoSerializer(serializers.Serializer):
 """圖書(shū)數(shù)據(jù)序列化器"""
 id = serializers.IntegerField(label='ID', read_only=True)
 name = serializers.CharField(label='名稱', max_length=20)
 pub_date = serializers.DateField(label='發(fā)布日期', required=False)
 readcount = serializers.IntegerField(label='閱讀量', required=False)
 commentcount = serializers.IntegerField(label='評(píng)論量', required=False)
 image = serializers.ImageField(label='圖片', required=False)

2.字段與選項(xiàng):

常用字段類型:

字段 字段構(gòu)造方式
BooleanField BooleanField()
NullBooleanField NullBooleanField()
CharField CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
EmailField EmailField(max_length=None, min_length=None, allow_blank=False)
RegexField RegexField(regex, max_length=None, min_length=None, allow_blank=False)
SlugField SlugField(maxlength=50, min_length=None, allow_blank=False) 正則字段,驗(yàn)證正則模式 [a-zA-Z0-9-]+
URLField URLField(max_length=200, min_length=None, allow_blank=False)
UUIDField UUIDField(format=‘hex_verbose') format: 1)
IPAddressField IPAddressField(protocol=‘both', unpack_ipv4=False, **options)
IntegerField IntegerField(max_value=None, min_value=None)
FloatField FloatField(max_value=None, min_value=None)
DecimalField DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位數(shù) decimal_palces: 小數(shù)點(diǎn)位置
DateTimeField DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)
DateField DateField(format=api_settings.DATE_FORMAT, input_formats=None)
TimeField TimeField(format=api_settings.TIME_FORMAT, input_formats=None)
DurationField DurationField()
ChoiceField ChoiceField(choices) choices與Django的用法相同
MultipleChoiceField MultipleChoiceField(choices)
FileField FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ImageField ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ListField ListField(child=, min_length=None, max_length=None)
DictField DictField(child=)

選項(xiàng)參數(shù):

參數(shù)名稱 作用
max_length 最大長(zhǎng)度
min_lenght 最小長(zhǎng)度
allow_blank 是否允許為空
trim_whitespace 是否截?cái)嗫瞻鬃址?/td>
max_value 最大值
min_value 最小值

通用參數(shù):

參數(shù)名稱 說(shuō)明
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
validators 該字段使用的驗(yàn)證器
error_messages 包含錯(cuò)誤編號(hào)與錯(cuò)誤信息的字典
label 用于HTML展示API頁(yè)面時(shí),顯示的字段名稱
help_text 用于HTML展示API頁(yè)面時(shí),顯示的字段幫助提示信息

3.Serialize對(duì)象:

構(gòu)造方法:

Serializer(instance, data, **kwarg)

(1)用于序列化時(shí),將模型類對(duì)象傳入instance參數(shù)
(2)用于反序列化時(shí),將要被反序列化的數(shù)據(jù)傳入data參數(shù)
(3)除了instance和data參數(shù)外,在構(gòu)造Serializer對(duì)象時(shí),還可通過(guò)context參數(shù)額外 添加數(shù)據(jù)。

例:

serializer = AccountSerializer(account, context={'request': request})

通過(guò)context參數(shù)附加的數(shù)據(jù),可以通過(guò)Serializer對(duì)象的context屬性獲取。

序列化

1.基本使用:

(1)查詢對(duì)象:
例:

from book.models import BookInfo
book = BookInfo.objects.get(id=4) # 單個(gè)對(duì)象
books = BookInfo.objects.all() # 多個(gè)對(duì)象

(2)構(gòu)造序列化對(duì)象:

from book.serializers import BookInfoSerializer
serializer = BookInfoSerializer(book) # 單個(gè)對(duì)象
serializers = BookInfoSerializer(books,many=True) # 多個(gè)對(duì)象需要添加many參數(shù)

(3)獲取序列化數(shù)據(jù):

serializer.data

2.外鍵嵌套使用:

(1)PrimaryKeyRelatedField:

此字段將被序列化為關(guān)聯(lián)對(duì)象的主鍵。

book = serializers.PrimaryKeyRelatedField(label='圖書(shū)',read_only=True)

或者

book=serializers.PrimaryKeyRelatedField(label='圖書(shū)',queryset=BookInfo.objects.all())

指明字段時(shí)需要包含read_only=True或者queryset參數(shù):

  • 包含read_only=True參數(shù)時(shí),該字段將不能用作反序列化使用
  • 包含queryset參數(shù)時(shí),將被用作反序列化時(shí)參數(shù)校驗(yàn)使用

結(jié)果:

{'id': 10, 'book': 3, 'description': '獨(dú)孤九劍', 'gender': 1, 'name': '令狐沖'}

(2)StringRelateField:

此字段將被序列化為關(guān)聯(lián)對(duì)象的字符串表示方式(即__str__方法的返回值)

book = serializers.StringRelatedField(label='圖書(shū)')

結(jié)果:

{'description': '獨(dú)孤九劍', 'name': '令狐沖', 'gender': 1, 'book': '笑傲江湖', 'id': 10}

(3)使用關(guān)聯(lián)對(duì)象的序列化器:

book = BookInfoSerializer()

結(jié)果:

{'book': OrderedDict([('id', 3), ('name', '笑傲江湖'), ('pub_date', '1995-12-24'),  ('readcount', 28), ('commentcount',  ('image', None)]), 'gender': 1, 'name': '令狐沖',  'description': '獨(dú)孤九劍', 'id': 10}

反序列化

1.驗(yàn)證:

(1)字段驗(yàn)證:

from book.serializers import BookInfoSerializer
data = {'pub_date':'2010-1-1','name':'python高級(jí)'}
serializer = BookInfoSerializer(data=data)
serializer.is_valid() # 驗(yàn)證成功返回True,失敗返回False

is_valid()方法還可以在驗(yàn)證失敗時(shí)拋出異常serializers.ValidationError,可以通過(guò)傳遞raise_exception=True參數(shù)開(kāi)啟,REST framework接收到此異常,會(huì)向前端返回HTTP 400 Bad Request響應(yīng)。

(2)字段選項(xiàng):

可在序列化器中設(shè)置字段的屬性,來(lái)限制數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證。

例:

屬性 描述
max_length 字符串的最大長(zhǎng)度(char)
min_length 字符串的最小長(zhǎng)度
max_value 最大值(int)
min_value 最小值
required 表明該字段在反序列化時(shí)必須輸入,默認(rèn)True
default 默認(rèn)值

(3)單個(gè)字段驗(yàn)證:

當(dāng)我們的類型和選項(xiàng)都滿足條件之后,我們需要對(duì)單個(gè)字段的值進(jìn)行校驗(yàn),我們?cè)谛?nbsp;列化器中實(shí)現(xiàn)方法以 validate_ 開(kāi)頭以字段名結(jié)尾的函數(shù)

格式:

def validate_字段名(self,value):
...
return value

例:

def validate_readcount(self,value):
  if value < 0:
   raise serializers.ValidationError('閱讀量不能為負(fù)數(shù)')
  # 驗(yàn)證完成之后,需要將 value返回
  return value

(4)多的字段驗(yàn)證:

對(duì)多個(gè)字段進(jìn)行校驗(yàn)的時(shí)候,我們?cè)谛蛄衅髦袑?shí)現(xiàn)

格式:

 def validate(self,attrs)
...
  return attrs

例:

def validate(self, data):
  # attrs = data
  # params --> 序列化器data --> attrs
  """
  data = {
   'name':'python',
   'pub_date':'2000-1-1',
   'readcount':10,
   'commentcount':100
  }
  """
  readcount = data.get('readcount')
  # if readcount<0:
  #  raise serializers.ValidationError()
  commentcount = data.get('commentcount')
  if readcount<commentcount:
   raise serializers.ValidationError('評(píng)論量不能大于閱讀量')
  #校驗(yàn)完成之后,必須要將數(shù)據(jù)返回回去
  return data

(5)自定義驗(yàn)證:

在字段中添加validators選項(xiàng)參數(shù),也可以補(bǔ)充驗(yàn)證行為

例:

name=serializers.CharField(max_length=20,validators=[custom_validate)]
def custom_validate(self):
if self == 'admin':
raise serializers.ValidationError('admin不可用')
 raise serializers.ValidationError('我就是來(lái)?yè)v亂的')

2.保存:

如果在驗(yàn)證成功后,想要基于validated_data完成數(shù)據(jù)對(duì)象的創(chuàng)建,可以通過(guò)實(shí)現(xiàn)create()和update()兩個(gè)方法來(lái)實(shí)現(xiàn)。

(1)create方法:

def create(self, validated_data):
  # validated_data 驗(yàn)證之后的數(shù)據(jù)
  # params(前端提交的數(shù)據(jù)) --> data(序列器接受的數(shù)據(jù)) --> attrs(多個(gè)字段 校驗(yàn)) --> validated_data(校驗(yàn)之后)
  # 如果前段提交的數(shù)據(jù) 經(jīng)過(guò)序列化器的驗(yàn)證之后完全滿足需求,則
  # validated_data = params
  """
   validated_data:
  data = {
   'name':'python',
   'pub_date':'2000-1-1',
   'readcount':10000,
   'commentcount':100
  }
  """
  # book = BookInfo()
  # book.save()
  book = BookInfo.objects.create(**validated_data)
  # 需要將創(chuàng)建的對(duì)象返回
  return book
( return BookInfo.objects.create(**validated_data)也可)

(2)update方法:

 def update(self, instance, validated_data):
"""更新,instance為要更新的對(duì)象實(shí)例"""
 instance.name = validated_data.get('name', instance.name)
 instance.pub_date = validated_data.get('pub_date', instance.pub_date)
 instance.readcount = validated_data.get('readcount', instance.readcount)
...
instance.save()
 return instance

實(shí)現(xiàn)了上述兩個(gè)方法后,在反序列化數(shù)據(jù)的時(shí)候,就可以通過(guò)save()方法返回一個(gè)數(shù)據(jù)對(duì)象實(shí)例了

例:

book = serializer.save()

如果創(chuàng)建序列化器對(duì)象的時(shí)候,沒(méi)有傳遞instance實(shí)例,則調(diào)用save()方法的時(shí)候,create()被調(diào)用,相反,如果傳遞了instance實(shí)例,則調(diào)用save()方法的時(shí)候,update()被調(diào)用。

兩點(diǎn)說(shuō)明:

1) 在對(duì)序列化器進(jìn)行save()保存時(shí),可以額外傳遞數(shù)據(jù),這些數(shù)據(jù)可以在create()和update()中的validated_data參數(shù)獲取到

serializer.save(owner=request.user)

2)默認(rèn)序列化器必須傳遞所有required的字段,否則會(huì)拋出驗(yàn)證異常。但是我們可以使用partial參數(shù)來(lái)允許部分字段更新

serializer = BookInfoSerializer(instance=book, data={'pub_date': '2999-1-1'}, partial=True)

模型類序列化器BookModelSerializer

1.定義:

例:

創(chuàng)建一個(gè)BookInfoSerializer

class BookInfoSerializer(serializers.ModelSerializer):

 class Meta:
  model = BookInfo
  fields = '__all__'

參數(shù) 描述
model 指明參照哪個(gè)模型類
fields 指明為模型類的哪些字段生成

2.指定字段:

(1)全部字段:

fields = '__all__'

(2)排除字段:

exclude = ['xxx', 'xxxx'...]

(3)指定字段:

fields = ['xxx', 'xxxx'...]

(4)只讀字段:

read_only_fields = ['xxx', 'xxxx'...]

3.添加額外參數(shù):

可以使用extra_kwargs參數(shù)為ModelSerializer添加或修改原有的選項(xiàng)參數(shù)

例:

class BookInfoSerializer(serializers.ModelSerializer):
class Meta:
model = BookInfo
 fields = ('id','name', 'readcount', 'commentcount')
 read_only_fields = ('id', 'readcount', 'commentcount')
 extra_kwargs = {
  'readcount': {'min_value': 0, 'required': True},
  'commentcount': {'max_value': 0, 'required': True},
 }

希望本文所述對(duì)大家基于Django框架的Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 詳解Python3 中hasattr()、getattr()、setattr()、delattr()函數(shù)及示例代碼數(shù)

    詳解Python3 中hasattr()、getattr()、setattr()、delattr()函數(shù)及示例代碼數(shù)

    本文通過(guò)示例代碼給大家詳細(xì)介紹了Python3 中hasattr()、getattr()、setattr()、delattr()函數(shù),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-04-04
  • PyQt5多線程防卡死和多窗口用法的實(shí)現(xiàn)

    PyQt5多線程防卡死和多窗口用法的實(shí)現(xiàn)

    這篇文章主要介紹了PyQt5多線程防卡死和多窗口用法的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 關(guān)于pip install uwsgi安裝失敗問(wèn)題的解決方案

    關(guān)于pip install uwsgi安裝失敗問(wèn)題的解決方案

    這篇文章主要介紹了關(guān)于pip install uwsgi安裝失敗問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • opencv-python圖像讀寫(xiě)模塊示例詳解

    opencv-python圖像讀寫(xiě)模塊示例詳解

    這篇文章主要介紹了opencv-python圖像讀寫(xiě)模塊,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Python替換Excel表格中的空值或指定值的實(shí)現(xiàn)

    Python替換Excel表格中的空值或指定值的實(shí)現(xiàn)

    本文介紹了使用Python的pandas庫(kù)結(jié)合openpyxl來(lái)批量替換Excel表格中的空值或指定值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Python實(shí)現(xiàn)注冊(cè)登錄系統(tǒng)

    Python實(shí)現(xiàn)注冊(cè)登錄系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了適合初學(xué)者學(xué)習(xí)的Python3銀行賬戶登錄系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Python調(diào)用GPT3.5接口的最新方法實(shí)例詳解

    Python調(diào)用GPT3.5接口的最新方法實(shí)例詳解

    這篇文章主要介紹了Python調(diào)用GPT3.5接口的最新方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 在Python中執(zhí)行異常處理的基本步驟

    在Python中執(zhí)行異常處理的基本步驟

    異常處理是編寫(xiě)健壯、可靠和易于調(diào)試的Python代碼中不可或缺的一部分,下面這篇文章主要給大家介紹了關(guān)于在Python中執(zhí)行異常處理的基本步驟,需要的朋友可以參考下
    2024-08-08
  • python?離散點(diǎn)圖畫(huà)法的實(shí)現(xiàn)

    python?離散點(diǎn)圖畫(huà)法的實(shí)現(xiàn)

    本文主要介紹了python?離散點(diǎn)圖畫(huà)法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • python3 實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)連接池的示例代碼

    python3 實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)連接池的示例代碼

    這篇文章主要介紹了python3 實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)連接池的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論

繁昌县| 太谷县| 城口县| 通道| 巴中市| 探索| 女性| 南阳市| 泾阳县| 小金县| 东宁县| 高台县| 甘孜县| 温宿县| 安福县| 山丹县| 景泰县| 日照市| 蚌埠市| 洮南市| 营山县| 鸡泽县| 苍山县| 宿州市| 仁布县| 玉田县| 政和县| 五莲县| 镇赉县| 盈江县| 延边| 泾源县| 和平区| 阿拉善盟| 临夏市| 鹤岗市| 通河县| 乐清市| 宣武区| 拜城县| 晋城|