中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Django框架怎么實現序列化與反序列化操作

發布時間:2021-04-13 16:19:44 來源:億速云 閱讀:136 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關使用Django框架怎么實現序列化與反序列化操作,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

Serializer類

1.定義:

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

例:

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

2.字段與選項:

常用字段類型:

字段字段構造方式
BooleanFieldBooleanField()
NullBooleanFieldNullBooleanField()
CharFieldCharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
EmailFieldEmailField(max_length=None, min_length=None, allow_blank=False)
RegexFieldRegexField(regex, max_length=None, min_length=None, allow_blank=False)
SlugFieldSlugField(maxlength=50, min_length=None, allow_blank=False) 正則字段,驗證正則模式 [a-zA-Z0-9-]+
URLFieldURLField(max_length=200, min_length=None, allow_blank=False)
UUIDFieldUUIDField(format=‘hex_verbose') format: 1)
IPAddressFieldIPAddressField(protocol=‘both', unpack_ipv4=False, **options)
IntegerFieldIntegerField(max_value=None, min_value=None)
FloatFieldFloatField(max_value=None, min_value=None)
DecimalFieldDecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位數 decimal_palces: 小數點位置
DateTimeFieldDateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)
DateFieldDateField(format=api_settings.DATE_FORMAT, input_formats=None)
TimeFieldTimeField(format=api_settings.TIME_FORMAT, input_formats=None)
DurationFieldDurationField()
ChoiceFieldChoiceField(choices) choices與Django的用法相同
MultipleChoiceFieldMultipleChoiceField(choices)
FileFieldFileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ImageFieldImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ListFieldListField(child=, min_length=None, max_length=None)
DictFieldDictField(child=)

選項參數:

參數名稱作用
max_length最大長度
min_lenght最小長度
allow_blank是否允許為空
trim_whitespace是否截斷空白字符
max_value最大值
min_value最小值

通用參數:

參數名稱說明
read_only表明該字段僅用于序列化輸出,默認False
write_only表明該字段僅用于反序列化輸入,默認False
required表明該字段在反序列化時必須輸入,默認True
default反序列化時使用的默認值
allow_null表明該字段是否允許傳入None,默認False
validators該字段使用的驗證器
error_messages包含錯誤編號與錯誤信息的字典
label用于HTML展示API頁面時,顯示的字段名稱
help_text用于HTML展示API頁面時,顯示的字段幫助提示信息

3.Serialize對象:

構造方法:

Serializer(instance, data, **kwarg)

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

例:

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

通過context參數附加的數據,可以通過Serializer對象的context屬性獲取。

序列化

1.基本使用:

(1)查詢對象:
例:

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

(2)構造序列化對象:

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

(3)獲取序列化數據:

serializer.data

2.外鍵嵌套使用:

(1)PrimaryKeyRelatedField:

此字段將被序列化為關聯對象的主鍵。

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

或者

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

指明字段時需要包含read_only=True或者queryset參數:

  • 包含read_only=True參數時,該字段將不能用作反序列化使用

  • 包含queryset參數時,將被用作反序列化時參數校驗使用

結果:

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

(2)StringRelateField:

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

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

結果:

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

(3)使用關聯對象的序列化器:

book = BookInfoSerializer()

結果:

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

反序列化

1.驗證:

(1)字段驗證:

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

is_valid()方法還可以在驗證失敗時拋出異常serializers.ValidationError,可以通過傳遞raise_exception=True參數開啟,REST framework接收到此異常,會向前端返回HTTP 400 Bad Request響應。

(2)字段選項:

可在序列化器中設置字段的屬性,來限制數據,對數據進行驗證。

例:

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

(3)單個字段驗證:

當我們的類型和選項都滿足條件之后,我們需要對單個字段的值進行校驗,我們在序 列化器中實現方法以 validate_ 開頭以字段名結尾的函數

格式:

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

例:

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

(4)多的字段驗證:

對多個字段進行校驗的時候,我們在序列器中實現

格式:

 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('評論量不能大于閱讀量')
  #校驗完成之后,必須要將數據返回回去
  return data

(5)自定義驗證:

在字段中添加validators選項參數,也可以補充驗證行為

例:

name=serializers.CharField(max_length=20,validators=[custom_validate)]
def custom_validate(self):
if self == 'admin':
raise serializers.ValidationError('admin不可用')
 raise serializers.ValidationError('我就是來搗亂的')

2.保存:

如果在驗證成功后,想要基于validated_data完成數據對象的創建,可以通過實現create()和update()兩個方法來實現。

(1)create方法:

def create(self, validated_data):
  # validated_data 驗證之后的數據
  # params(前端提交的數據) --> data(序列器接受的數據) --> attrs(多個字段 校驗) --> validated_data(校驗之后)
  # 如果前段提交的數據 經過序列化器的驗證之后完全滿足需求,則
  # 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)
  # 需要將創建的對象返回
  return book
( return BookInfo.objects.create(**validated_data)也可)

(2)update方法:

 def update(self, instance, validated_data):
"""更新,instance為要更新的對象實例"""
 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

實現了上述兩個方法后,在反序列化數據的時候,就可以通過save()方法返回一個數據對象實例了

例:

book = serializer.save()

如果創建序列化器對象的時候,沒有傳遞instance實例,則調用save()方法的時候,create()被調用,相反,如果傳遞了instance實例,則調用save()方法的時候,update()被調用。

兩點說明:

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

serializer.save(owner=request.user)

2)默認序列化器必須傳遞所有required的字段,否則會拋出驗證異常。但是我們可以使用partial參數來允許部分字段更新

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

模型類序列化器BookModelSerializer

1.定義:

例:

創建一個BookInfoSerializer

class BookInfoSerializer(serializers.ModelSerializer):

 class Meta:
  model = BookInfo
  fields = '__all__'
參數描述
model指明參照哪個模型類
fields指明為模型類的哪些字段生成

2.指定字段:

(1)全部字段:

fields = '__all__'

(2)排除字段:

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

(3)指定字段:

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

(4)只讀字段:

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

3.添加額外參數:

可以使用extra_kwargs參數為ModelSerializer添加或修改原有的選項參數

例:

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},
 }

關于使用Django框架怎么實現序列化與反序列化操作就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

喜德县| 曲麻莱县| 乌兰县| 洮南市| 久治县| 潞西市| 平果县| 淮北市| 竹北市| 福州市| 牟定县| 宝清县| 濮阳市| 叶城县| 通州市| 吉首市| 马尔康县| 嘉义市| 嘉义县| 乌拉特中旗| 平潭县| 灵宝市| 曲靖市| 福贡县| 北海市| 当阳市| 石台县| 武义县| 忻州市| 澄城县| 新泰市| 朝阳县| 西乌| 广饶县| 原平市| 小金县| 信宜市| 达拉特旗| 东乡族自治县| 定西市| 襄垣县|