资讯专栏INFORMATION COLUMN

marshmallow之自定义Field

AWang / 1735人阅读

摘要:有三种方式创建自定义的。下面的例子判断某个对象是否是某个对象的作者,以及的属性是否出现单词自定义错误信息字段验证产生的错误信息可以在类级别或实例级别配置。在类级别时,可以定义为错误码和错误信息的字典映射在类实例化时,给参数传参对象

有三种方式创建自定义的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.Methodfields.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

相关文章

  • marshmallow快速上手

    摘要:方法对应的是方法,它反序列化一个字典为数据结构。某些例如和内置了验证器验证集合时,错误字典将基于无效字段的索引作为键通过给的参数传递对象,可以执行额外的验证验证函数可以返回布尔值或抛出异常。 快速上手 Declaring Schemas 首先创建一个基础的user模型(只是为了演示,并不是真正的模型): import datetime as dt class User(object)...

    jhhfft 评论0 收藏0
  • marshmallow之Schema延伸功能

    摘要:创建实例时如果传递了,表示需要接收输入数据集合,装饰器注册预处理和后处理方法时需要传递参数。 预处理和后处理方法 数据的预处理和后处理方法通过pre_load, post_load, pre_dump和post_dump装饰器注册: from marshmallow import Schema, fields, pre_load class UserSchema(Schema): ...

    hzx 评论0 收藏0
  • marshmallow之schema嵌套

    摘要:嵌套可以嵌套使用以表示对象间的关系如外键关系。在下面的例子中,和对象是一对多的关系必须使用或参数避免无限递归也可以使用导入模块的方式传递嵌套,如自嵌套给传递字符串参数表示和对象本身的关系 schema嵌套 schema可以嵌套使用以表示对象间的关系(如外键关系)。 例如下例中Blog有一个用User对象表示的author属性: import datetime as dt class ...

    miracledan 评论0 收藏0
  • 微信小程序数据分析之自定义分析

    摘要:什么是自定义分析引用下官方文档自定义分析支持灵活多维和近实时的用户行为分析,可以通过自定义上报,对用户在小程序内的行为做精细化跟踪,满足页面访问等标准统计以外的个性化分析需求。 在小程序后台,微信已经提供了强大的数据分析功能,包括实时统计、访问分析、来源分析和用户画像功能,可以说对一般的数据分析已经完全足够了,但有时应用需要做一些更加精准的数据分析,比如具体到某一个页面的分享,页面中某...

    firim 评论0 收藏0
  • 微信小程序数据分析之自定义分析

    摘要:什么是自定义分析引用下官方文档自定义分析支持灵活多维和近实时的用户行为分析,可以通过自定义上报,对用户在小程序内的行为做精细化跟踪,满足页面访问等标准统计以外的个性化分析需求。 在小程序后台,微信已经提供了强大的数据分析功能,包括实时统计、访问分析、来源分析和用户画像功能,可以说对一般的数据分析已经完全足够了,但有时应用需要做一些更加精准的数据分析,比如具体到某一个页面的分享,页面中某...

    siberiawolf 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<