Django框架序列化與反序列化操作詳解
本文實例講述了Django框架序列化與反序列化操作。分享給大家供大家參考,具體如下:
Serializer類
1.定義:
Django REST framework中的Serializer使用類來定義,須繼承rest_framework.serializers.Serializer。
例:
class BookInfoSerializer(serializers.Serializer): """圖書數(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='評論量', required=False) image = serializers.ImageField(label='圖片', required=False)
2.字段與選項:
常用字段類型:
字段 | 字段構(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) 正則字段,驗證正則模式 [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ù)點位置 |
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=) |
選項參數(shù):
參數(shù)名稱 | 作用 |
---|---|
max_length | 最大長度 |
min_lenght | 最小長度 |
allow_blank | 是否允許為空 |
trim_whitespace | 是否截斷空白字符 |
max_value | 最大值 |
min_value | 最小值 |
通用參數(shù):
參數(shù)名稱 | 說明 |
---|---|
read_only | 表明該字段僅用于序列化輸出,默認(rèn)False |
write_only | 表明該字段僅用于反序列化輸入,默認(rèn)False |
required | 表明該字段在反序列化時必須輸入,默認(rèn)True |
default | 反序列化時使用的默認(rèn)值 |
allow_null | 表明該字段是否允許傳入None,默認(rèn)False |
validators | 該字段使用的驗證器 |
error_messages | 包含錯誤編號與錯誤信息的字典 |
label | 用于HTML展示API頁面時,顯示的字段名稱 |
help_text | 用于HTML展示API頁面時,顯示的字段幫助提示信息 |
3.Serialize對象:
構(gòu)造方法:
Serializer(instance, data, **kwarg)
(1)用于序列化時,將模型類對象傳入instance參數(shù)
(2)用于反序列化時,將要被反序列化的數(shù)據(jù)傳入data參數(shù)
(3)除了instance和data參數(shù)外,在構(gòu)造Serializer對象時,還可通過context參數(shù)額外 添加數(shù)據(jù)。
例:
serializer = AccountSerializer(account, context={'request': request})
通過context參數(shù)附加的數(shù)據(jù),可以通過Serializer對象的context屬性獲取。
序列化
1.基本使用:
(1)查詢對象:
例:
from book.models import BookInfo book = BookInfo.objects.get(id=4) # 單個對象 books = BookInfo.objects.all() # 多個對象
(2)構(gòu)造序列化對象:
from book.serializers import BookInfoSerializer serializer = BookInfoSerializer(book) # 單個對象 serializers = BookInfoSerializer(books,many=True) # 多個對象需要添加many參數(shù)
(3)獲取序列化數(shù)據(jù):
serializer.data
2.外鍵嵌套使用:
(1)PrimaryKeyRelatedField:
此字段將被序列化為關(guān)聯(lián)對象的主鍵。
book = serializers.PrimaryKeyRelatedField(label='圖書',read_only=True)
或者
book=serializers.PrimaryKeyRelatedField(label='圖書',queryset=BookInfo.objects.all())
指明字段時需要包含read_only=True或者queryset參數(shù):
- 包含read_only=True參數(shù)時,該字段將不能用作反序列化使用
- 包含queryset參數(shù)時,將被用作反序列化時參數(shù)校驗使用
結(jié)果:
{'id': 10, 'book': 3, 'description': '獨孤九劍', 'gender': 1, 'name': '令狐沖'}
(2)StringRelateField:
此字段將被序列化為關(guān)聯(lián)對象的字符串表示方式(即__str__方法的返回值)
book = serializers.StringRelatedField(label='圖書')
結(jié)果:
{'description': '獨孤九劍', 'name': '令狐沖', 'gender': 1, 'book': '笑傲江湖', 'id': 10}
(3)使用關(guān)聯(lián)對象的序列化器:
book = BookInfoSerializer()
結(jié)果:
{'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參數(shù)開啟,REST framework接收到此異常,會向前端返回HTTP 400 Bad Request響應(yīng)。
(2)字段選項:
可在序列化器中設(shè)置字段的屬性,來限制數(shù)據(jù),對數(shù)據(jù)進(jìn)行驗證。
例:
屬性 | 描述 |
---|---|
max_length | 字符串的最大長度(char) |
min_length | 字符串的最小長度 |
max_value | 最大值(int) |
min_value | 最小值 |
required | 表明該字段在反序列化時必須輸入,默認(rèn)True |
default | 默認(rèn)值 |
(3)單個字段驗證:
當(dāng)我們的類型和選項都滿足條件之后,我們需要對單個字段的值進(jìn)行校驗,我們在序 列化器中實現(xiàn)方法以 validate_ 開頭以字段名結(jié)尾的函數(shù)
格式:
def validate_字段名(self,value): ... return value
例:
def validate_readcount(self,value): if value < 0: raise serializers.ValidationError('閱讀量不能為負(fù)數(shù)') # 驗證完成之后,需要將 value返回 return value
(4)多的字段驗證:
對多個字段進(jìn)行校驗的時候,我們在序列器中實現(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('評論量不能大于閱讀量') #校驗完成之后,必須要將數(shù)據(jù)返回回去 return data
(5)自定義驗證:
在字段中添加validators選項參數(shù),也可以補充驗證行為
例:
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完成數(shù)據(jù)對象的創(chuàng)建,可以通過實現(xiàn)create()和update()兩個方法來實現(xiàn)。
(1)create方法:
def create(self, validated_data): # validated_data 驗證之后的數(shù)據(jù) # params(前端提交的數(shù)據(jù)) --> data(序列器接受的數(shù)據(jù)) --> attrs(多個字段 校驗) --> validated_data(校驗之后) # 如果前段提交的數(shù)據(jù) 經(jīng)過序列化器的驗證之后完全滿足需求,則 # 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)建的對象返回 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
實現(xiàn)了上述兩個方法后,在反序列化數(shù)據(jù)的時候,就可以通過save()方法返回一個數(shù)據(jù)對象實例了
例:
book = serializer.save()
如果創(chuàng)建序列化器對象的時候,沒有傳遞instance實例,則調(diào)用save()方法的時候,create()被調(diào)用,相反,如果傳遞了instance實例,則調(diào)用save()方法的時候,update()被調(diào)用。
兩點說明:
1) 在對序列化器進(jìn)行save()保存時,可以額外傳遞數(shù)據(jù),這些數(shù)據(jù)可以在create()和update()中的validated_data參數(shù)獲取到
serializer.save(owner=request.user)
2)默認(rèn)序列化器必須傳遞所有required的字段,否則會拋出驗證異常。但是我們可以使用partial參數(shù)來允許部分字段更新
serializer = BookInfoSerializer(instance=book, data={'pub_date': '2999-1-1'}, partial=True)
模型類序列化器BookModelSerializer
1.定義:
例:
創(chuàng)建一個BookInfoSerializer
class BookInfoSerializer(serializers.ModelSerializer): class Meta: model = BookInfo fields = '__all__'
參數(shù) | 描述 |
---|---|
model | 指明參照哪個模型類 |
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添加或修改原有的選項參數(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}, }
希望本文所述對大家基于Django框架的Python程序設(shè)計有所幫助。
相關(guān)文章
Pandas對每個分組應(yīng)用apply函數(shù)的實現(xiàn)
這篇文章主要介紹了Pandas對每個分組應(yīng)用apply函數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12全網(wǎng)最細(xì) Python 格式化輸出用法講解(推薦)
這篇文章主要介紹了全網(wǎng)最細(xì) Python 格式化輸出用法講解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Pytorch可視化(顯示圖片)及格式轉(zhuǎn)換問題
這篇文章主要介紹了Pytorch可視化(顯示圖片)及格式轉(zhuǎn)換問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12