marshmallow之自定義Field

2021-10-12 05:04:57 字數 2818 閱讀 9279

有三種方式建立自定義的 field。

建立 field 類的子類

建立繼承自marshmallow.fields.field類的子類並實現_serialize和 / 或_deserialize方法:

from marshmallow import fields, schema

class titlecased(fields.field):

def _serialize(self, value, attr, obj):

if value is none:

return 『』

return value.title()

class userschema(schema):

name = fields.string()

email = fields.string()

created_at = fields.datetime()

titlename = titlecased(attribute=「name」)

method fields

fields.method將序列化 schema 中某個方法的返回值,該方法必須接收乙個要進行序列化的物件的引數obj:

class userschema(schema):

name = fields.string()

email = fields.string()

created_at = fields.datetime()

since_created = fields.method(「get_days_since_created」)

def get_days_since_created(self, obj):

return dt.datetime.now().day - obj.created_at.day

function fields

fields.function將序列化傳遞給它的函式的返回值,也接收乙個obj引數:

class userschema(schema):

name = fields.string()

email = fields.string()

created_at = fields.datetime()

uppername = fields.function(lambda obj: obj.name.upper())

method 和 function 的反序列化

fields.method和fields.function都接收乙個可選的deserialize引數,該引數定義了如何反序列化字段:

class userschema(schema):

balance = fields.method('get_balance', deserialize='load_balance')

def get_balance(self, obj):

return obj.income - obj.debt

def load_balance(self, value):

return float(value)

schema = userschema()

result = schema.load()

result.data[『balance』]

為 method 和 function 新增上下文

function 和 method 序列化時可能需要相關環境資訊。可以為 schema 設定context屬性 (dict 物件),function 和 method 可以訪問此字典。

下面的例子判斷某個 user 物件是否是某個 blog 物件的作者,以及 blog 的 title 屬性是否出現bicycle單詞:

class userschema(schema):

name = fields.string()

is_author = fields.function(lambda user, context: user == context['blog'].author)

likes_bikes = fields.method('writes_about_bikes')

def writes_about_bikes(self, user):

return 'bicycle' in self.context['blog'].title.lower()

schema = userschema()

user = user(『freddie mercury』, 『[email protected]』)

blog = blog(『bicycle blog』, author=user)

schema.context =

data, errors = schema.dump(user)

data[『is_author』]

data[『likes_bikes』]

自定義錯誤資訊

字段驗證產生的錯誤資訊可以在類級別或例項級別配置。

在類級別時,default_error_messages可以定義為錯誤碼和錯誤資訊的字典對映:

from marshmallow import fields

class mydate(fields.date):

default_error_messages =

在 field 類例項化時,給error_messages引數傳參 (dict 物件):

from marshmallow import schema, fields

class userschema(schema):

name = fields.str(

required=true,

error_messages=

)

自定義view之自定義屬性

1.首先在res的values檔案下新建乙個名為attrs.xml檔案 在該xml檔案中編寫我們需要的屬性 declare styleable後面的name必須要與接下來要自定義的view名一致。attr 後面的name表示需要自定義的屬性,format表示這些屬性的型別 2.新建乙個類繼承text...

Android自定義控制項之自定義View 二

效果如下圖 1 自定義ringview繼承view新增其構造方法並建立畫筆 public class ringview extends view protected boolean isrunning false public ringview context context public ring...

(原創)自定義控制項之自定義屬性

自定義控制項過程中,我們往往需要給自己的控制項來自定義一些屬性 現在就來大概介紹下流程 第一步values下新建attrs.xml檔案 檔案裡標籤如下 如下所示 第二步來到布局檔案的根標籤下 使用的格式如下 如下所示 第三步 來到自定義控制項的類的構造方法中 該方法有乙個attrs引數 執行方法 g...