摘要:有三种方式创建自定义的。下面的例子判断某个对象是否是某个对象的作者,以及的属性是否出现单词自定义错误信息字段验证产生的错误信息可以在类级别或实例级别配置。在类级别时,可以定义为错误码和错误信息的字典映射在类实例化时,给参数传参对象
有三种方式创建自定义的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.dayFunction 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())
fields.Method和fields.Function都接收一个可选的deserialize参数,该参数定义了如何反序列化字段:
class UserSchema(Schema): # Method接收字符串类型的方法名, Function接收callable对象 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({"balance": "100.00"}) result.data["balance"] # => 100.0为Method和Function添加上下文
Function和Method序列化时可能需要相关环境信息。可以为schema设置context属性(dict对象),Function和Method可以访问此字典。
下面的例子判断某个User对象是否是某个Blog对象的作者,以及Blog的title属性是否出现bicycle单词:
class UserSchema(Schema): name = fields.String() # Function fields optionally receive context argument is_author = fields.Function(lambda user, context: user == context["blog"].author) likes_bikes = fields.Method("writes_about_bikes") # Method fields also optionally receive context argument def writes_about_bikes(self, user): return "bicycle" in self.context["blog"].title.lower() schema = UserSchema() user = User("Freddie Mercury", "fred@queen.com") blog = Blog("Bicycle Blog", author=user) schema.context = {"blog": blog} data, errors = schema.dump(user) data["is_author"] # => True data["likes_bikes"] # => True自定义错误信息
字段验证产生的错误信息可以在类级别或实例级别配置。
在类级别时,default_error_messages可以定义为错误码和错误信息的字典映射:
from marshmallow import fields class MyDate(fields.Date): default_error_messages = { "400001": "Please provide a valid date.", }
在Field类实例化时,给error_messages参数传参(dict对象):
from marshmallow import Schema, fields class UserSchema(Schema): name = fields.Str( required=True, error_messages={"required": "Please provide a name."} )
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/43865.html
摘要:方法对应的是方法,它反序列化一个字典为数据结构。某些例如和内置了验证器验证集合时,错误字典将基于无效字段的索引作为键通过给的参数传递对象,可以执行额外的验证验证函数可以返回布尔值或抛出异常。 快速上手 Declaring Schemas 首先创建一个基础的user模型(只是为了演示,并不是真正的模型): import datetime as dt class User(object)...
摘要:创建实例时如果传递了,表示需要接收输入数据集合,装饰器注册预处理和后处理方法时需要传递参数。 预处理和后处理方法 数据的预处理和后处理方法通过pre_load, post_load, pre_dump和post_dump装饰器注册: from marshmallow import Schema, fields, pre_load class UserSchema(Schema): ...
摘要:嵌套可以嵌套使用以表示对象间的关系如外键关系。在下面的例子中,和对象是一对多的关系必须使用或参数避免无限递归也可以使用导入模块的方式传递嵌套,如自嵌套给传递字符串参数表示和对象本身的关系 schema嵌套 schema可以嵌套使用以表示对象间的关系(如外键关系)。 例如下例中Blog有一个用User对象表示的author属性: import datetime as dt class ...
摘要:什么是自定义分析引用下官方文档自定义分析支持灵活多维和近实时的用户行为分析,可以通过自定义上报,对用户在小程序内的行为做精细化跟踪,满足页面访问等标准统计以外的个性化分析需求。 在小程序后台,微信已经提供了强大的数据分析功能,包括实时统计、访问分析、来源分析和用户画像功能,可以说对一般的数据分析已经完全足够了,但有时应用需要做一些更加精准的数据分析,比如具体到某一个页面的分享,页面中某...
摘要:什么是自定义分析引用下官方文档自定义分析支持灵活多维和近实时的用户行为分析,可以通过自定义上报,对用户在小程序内的行为做精细化跟踪,满足页面访问等标准统计以外的个性化分析需求。 在小程序后台,微信已经提供了强大的数据分析功能,包括实时统计、访问分析、来源分析和用户画像功能,可以说对一般的数据分析已经完全足够了,但有时应用需要做一些更加精准的数据分析,比如具体到某一个页面的分享,页面中某...
阅读 2671·2021-10-09 09:44
阅读 3483·2019-08-30 15:54
阅读 2069·2019-08-30 14:16
阅读 2762·2019-08-30 13:09
阅读 796·2019-08-30 13:08
阅读 1233·2019-08-29 16:29
阅读 1618·2019-08-26 13:57
阅读 1894·2019-08-26 13:53