有三種方式建立自定義的 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...