See also

Need help upgrading to marshmallow 3? Check out the upgrading guide.


3.21.1 (2024-03-04)

Bug fixes:

  • Fix error message when field is declared as a class and not an instance (#2245). Thanks @travnick for reporting.

3.21.0 (2024-02-26)

Bug fixes:

  • Fix validation of URL fields to allow missing user field, per NWG RFC 3986 (#2232). Thanks @ddennerline3 for reporting and @deckar01 for the PR.

Other changes:

  • Backwards-incompatible: __version__, __parsed_version__, and __version_info__ attributes are deprecated (#2227). Use feature detection or importlib.metadata.version("marshmallow") instead.

3.20.2 (2024-01-09)

Bug fixes:

Other changes:

  • Officially support Python 3.12 (#2188). Thanks @hugovk for the PR.

3.20.1 (2023-07-20)

Bug fixes:

  • Fix call to get_declared_fields: pass dict_cls again (#2152). Thanks @Cheaterman for reporting.

3.20.0 (2023-07-20)


  • Add absolute parameter to URL validator and Url field (#2123). Thanks @sirosen for the PR.

  • Use Abstract Base Classes to define FieldABC and SchemaABC (#1449). Thanks @aditkumar72 for the PR.

  • Use OrderedSet as default set_class. Schemas are now ordered by default. (#1744)

Bug fixes:

  • Handle OSError and OverflowError in utils.from_timestamp (#2102). Thanks @TheBigRoomXXL for the PR.

  • Fix the default inheritance of nested partial schemas (#2149). Thanks @matejsp for reporting.

Other changes:

  • Officially support Python 3.11 (#2067).

  • Drop support for Python 3.7 (#2135).

3.19.0 (2022-11-11)


  • Add timestamp and timestamp_ms formats to fields.DateTime (#612). Thanks @vgavro for the suggestion and thanks @vanHoi for the PR.

3.18.0 (2022-09-15)


Bug fixes:

  • Fix typing in Field._serialize signature (#2046).

3.17.1 (2022-08-22)

Bug fixes:

  • Add return type to fields.Email.__init__ (#2018). Thanks @kkirsche for the PR.

  • Add missing type hint to IPInterface __init__ (#2036).

3.17.0 (2022-06-26)


  • Support serialization as float in TimeDelta field (#1998). Thanks @marcosatti for the PR.

  • Add messages_dict property to ValidationError to facilitate type checking (#1976). Thanks @sirosen for the PR.

3.16.0 (2022-05-29)


  • Raise ValueError if an invalid value is passed to the unknown argument (#1721, #1732). Thanks @sirosen for the PR.

Other changes:

3.15.0 (2022-03-12)


  • Allow passing a dict to fields.Nested (#1935). Thanks @sirosen for the PR.

Other changes:

  • Address distutils deprecation warning in Python 3.10 (#1903). Thanks @kkirsche for the PR.

  • Add py310 to black target-version (#1921).

  • Drop support for Python 3.6 (#1923).

  • Use postponed evaluation of annotations (#1932). Thanks @Isira-Seneviratne for the PR.

3.14.1 (2021-11-13)

Bug fixes:

3.14.0 (2021-10-17)

Bug fixes:

  • Fix fields.TimeDelta serialization precision (#1865). Thanks @yarsanich for reporting.

Other changes:

  • Fix type-hints for data arg in Schema.validate to accept list of dictionaries (#1790, #1868). Thanks @yourun-proger for PR.

  • Improve warning when passing metadata as keyword arguments (#1882). Thanks @traherom for the PR.

  • Don’t build universal wheels. We don’t support Python 2 anymore. (#1860) Thanks @YKdvd for reporting.

  • Make the build reproducible (#1862).

  • Drop support for Python 3.5 (#1863).

  • Test against Python 3.10 (#1888).

3.13.0 (2021-07-21)


  • Replace missing/default field parameters with load_default/dump_default (#1742). Thanks @sirosen for the PR.


  • The use of missing/default field parameters is deprecated and will be removed in marshmallow 4. load_default/dump_default should be used instead.

3.12.2 (2021-07-06)

Bug fixes:

  • Don’t expose Fields as Schema attributes. This reverts a change introduced in 3.12.0 that causes issues when field names conflict with Schema attributes or methods. Fieldss are still accessible on a

    Schema instance through the fields attribute. (#1843)

3.12.1 (2021-05-10)

Bug fixes:

  • Fix bug that raised an AttributeError when instantiating a Schema with a field named parent (#1808). Thanks @flying-sheep for reporting and helping with the fix.

3.12.0 (2021-05-09)


  • Add validate.And (#1768). Thanks @rugleb for the suggestion.

  • Add type annotations to marshmallow.decorators (#1788, #1789). Thanks @michaeldimchuk for the PR.

  • Let Fields be accessed by name as Schema attributes (#1631).

Other changes:

  • Improve types in marshmallow.validate (#1786).

  • Make marshmallow.validate.Validator an abstract base class (#1786).

  • Remove unnecessary list cast (#1785).

3.11.1 (2021-03-29)

Bug fixes:

  • Fix treatment of dotted keys when unknown=INCLUDE (#1506). Thanks @rbu for reporting and thanks @sirosen for the fix (#1745).

3.11.0 (2021-03-28)


  • Add fields.IPInterface, fields.IPv4Interface, and IPv6Interface (#1733). Thanks @madeinoz67 for the suggestion and the PR.

  • Raise AttributeError for missing methods when using fields.Method (#1675). Thanks @lassandroan.

Other changes:

  • Remove unnecessary hasattr and getattr checks in Field (#1770).

3.10.0 (2020-12-19)


  • Passing field metadata via keyword arguments is deprecated and will be removed in marshmallow 4 (#1350). Use the explicit metadata=... argument instead. Thanks @sirosen.

3.9.1 (2020-11-07)

Bug fixes:

  • Cast to mapping type in Mapping.serialize and Mapping.deserialize (#1685).

  • Fix bug letting Dict pass invalid dict on deserialization when no key or value Field is specified (#1685).

3.9.0 (2020-10-31)


  • Add format argument to fields.Time and timeformat class Meta option (#686). Thanks @BennyAlex for the suggestion and thanks @infinityxxx for the PR.

Other changes:

  • Remove usage of implicit typing.Optional (#1663). Thanks @nadega for the PR.

3.8.0 (2020-09-16)


  • Add fields.IP, fields.IPv4 and fields.IPv6 (#1485). Thanks @mgetka for the PR.

Bug fixes:

3.7.1 (2020-07-20)

Bug fixes:

  • fields.Boolean correctly serializes non-hashable types (#1633). Thanks @jun0jang for the PR.

3.7.0 (2020-07-08)


  • marshmallow.pprint is deprecated and will be removed in marshmallow 4 (#1588).


  • Document default_error_messages on field classes (#1619). Thanks @weeix.

Bug fixes:

  • Fix passing only and exclude to Nested with an ordered Schema (#1627). Thanks @juannorris for the PR.

3.6.1 (2020-06-02)

No code changes–only docs and contributor-facing updates in this release.


  • Documentation: improve custom fields example (#1538). Thanks @pablospizzamiglio for reporting the problem with the old example and thanks @Resinderate for the PR.

  • Documentation: Split up API reference into multiple pages and add summary tables (#1587). Thanks @EpicWink for the PR.

3.6.0 (2020-05-08)


  • Add validate.ContainsNoneOf (#1528). Thanks @Resinderate for the suggestion and the PR.

3.5.2 (2020-04-30)

Bug fixes:

3.5.1 (2020-03-05)

Bug fixes:

  • Includes bug fix from 2.21.0.

3.5.0 (2020-02-19)

Bug fixes:

  • Fix list of nullable nested fields List(Nested(Field, allow_none=True) (#1497). Because this fix reverts an optimization introduced to speed-up serialization and deserialization of lists of nested fields, a negative impact on performance in this specific case is expected.

3.4.0 (2020-02-02)


Bug fixes:

  • Fix typing for data param of Schema.load and ValidationError (#1492). Thanks @mehdigmira for reporting and thanks @dfirst for the PR.

Other changes:

  • Remove unnecessary typecasts (#1500). Thanks @hukkinj1.

  • Remove useless _serialize override in UUID field (#1489).

3.3.0 (2019-12-05)


  • fields.Nested may take a callable that returns a schema instance. Use this to resolve order-of-declaration issues when schemas nest each other (#1146).

# <3.3
class AlbumSchema(Schema):
    title = fields.Str()
    artist = fields.Nested("ArtistSchema", only=("name",))

class ArtistSchema(Schema):
    name = fields.Str()
    albums = fields.List(fields.Nested(AlbumSchema))

# >=3.3
class AlbumSchema(Schema):
    title = fields.Str()
    artist = fields.Nested(lambda: ArtistSchema(only=("name",)))

class ArtistSchema(Schema):
    name = fields.Str()
    albums = fields.List(fields.Nested(AlbumSchema))


  • Passing the string "self" to fields.Nested is deprecated. Use a callable instead.

from marshmallow import Schema, fields

# <3.3
class PersonSchema(Schema):
    partner = fields.Nested("self", exclude=("partner",))
    friends = fields.List(fields.Nested("self"))

# >=3.3
class PersonSchema(Schema):
    partner = fields.Nested(lambda: PersonSchema(exclude=("partner")))
    friends = fields.List(fields.Nested(lambda: PersonSchema()))

Other changes:

3.2.2 (2019-11-04)

Bug fixes:

  • Don’t load fields for which load_only and dump_only are both True (#1448).

  • Fix types in marshmallow.validate (#1446).


  • Test against Python 3.8 (#1431).

3.2.1 (2019-09-30)

Bug fixes:

  • Fix typing for Schema.dump[s] (#1416).

3.2.0 (2019-09-17)


  • Add type annotations to marshmallow.schema and marshmallow.validate (#1407, #663).

Bug fixes:


  • Remove unnecessary BaseSchema superclass (#1406).

3.1.1 (2019-09-16)

Bug fixes:

  • Restore inheritance hierarchy of Number fields (#1403). fields.Integer and fields.Decimal inherit from fields.Number.

  • Fix bug that raised an uncaught error when a nested schema instance had an unpickleable object in its context (#1404). Thanks @metheoryt for reporting.

3.1.0 (2019-09-15)


  • Add more type annotations (#663). Type information is distributed per PEP 561 . Thanks @fuhrysteve for helping with this.

Bug fixes:

  • Includes bug fix from 2.20.5.

3.0.5 (2019-09-12)

Bug fixes:

  • Fix bug that raised an uncaught error when passing both a schema instance and only to Nested (#1395). This bug also affected passing a schema instance to fields.Pluck.

3.0.4 (2019-09-11)

Bug fixes:

  • Fix propagating dot-delimited only and exclude parameters to nested schema instances (#1384).

  • Includes bug fix from 2.20.4 (#1160).

3.0.3 (2019-09-04)

Bug fixes:

  • Handle when data_key is an empty string (#1378). Thanks @jtrakk for reporting.

3.0.2 (2019-09-04)

Bug fixes:

  • Includes bug fix from 2.20.3 (#1376).

  • Fix incorrect super() call in SchemaMeta.__init__ (#1362).

3.0.1 (2019-08-21)

Bug fixes:

  • Fix bug when nesting fields.DateTime within fields.List or fields.Tuple (#1357). This bug was introduced in 3.0.0rc9. Thanks @zblz for reporting.

3.0.0 (2019-08-18)


  • Optimize List(Nested(...)) (#779).

  • Minor performance improvements and cleanup (#1328).

  • Add Schema.from_dict (#1312).


  • is deprecated. Use Field.make_error instead.

  • Remove UUID validation from fields.UUID, for consistency with other fields (#1132).


  • Various docs improvements (#1329).

3.0.0rc9 (2019-07-31)


  • Backwards-incompatible: Validation does not occur on serialization (#1132). This significantly improves serialization performance.

  • Backwards-incompatible: DateTime does not affect timezone information on serialization and deserialization (#1234, #1278).

  • Add NaiveDateTime and AwareDateTime to enforce timezone awareness (#1234, #1287).

  • Backwards-incompatible: List does not wrap single values in a list on serialization (#1307).

  • Backwards-incompatible: Schema.handle_error receives many and partial as keyword arguments (#1321).

  • Use raise from more uniformly to improve stack traces (#1313).

  • Rename Nested.__schema to Nested._schema to prevent name mangling (#1289).

  • Performance improvements (#1309).


  • LocalDateTime is removed (#1234).

  • marshmallow.utils.utc is removed. Use datetime.timezone.utc instead.

Bug fixes:


3.0.0rc8 (2019-07-04)


  • Propagate only and exclude parameters to Nested fields within List and Dict (#779, #946).

  • Use email.utils.parsedate_to_datetime instead of conditionally using dateutil for parsing RFC dates (#1246).

  • Use internal util functions instead of conditionally using dateutil for parsing ISO 8601 datetimes, dates and times. Timezone info is now correctly deserialized whether or not dateutil is installed. (#1265)

  • Improve error messages for validate.Range.

  • Use raise from error for better stack traces (#1254). Thanks @fuhrysteve.

  • python-dateutil is no longer used. This resolves the inconsistent behavior based on the presence of python-dateutil (#497, #1234).

Bug fixes:

  • Fix method resolution for __init__ method of fields.Email and fields.URL (#1268). Thanks @dursk for the catch and patch.

  • Includes bug fixes from 2.19.4 and 2.19.5.

Other changes:

  • Backwards-incompatible: Rename fields.List.container to fields.List.inner, fields.Dict.key_container to fields.Dict.key_field, and fields.Dict.value_container to fields.Dict.value_field.

  • Switch to Azure Pipelines for CI (#1261).

3.0.0rc7 (2019-06-15)


  • Backwards-incompatible: many is passed as a keyword argument to methods decorated with pre_load, post_load, pre_dump, post_dump, and validates_schema. partial is passed as a keyword argument to methods decorated with pre_load, post_load and validates_schema. **kwargs should be added to all decorated methods.

  • Add min_inclusive and max_exclusive parameters to validate.Range (#1221). Thanks @kdop for the PR.

Bug fixes:

  • Fix propagation of partial to Nested containers (part of #779).

  • Includes bug fix from 2.19.3.

Other changes:

  • Backwards-incompatible: Use keyword-only arguments (#1216).

3.0.0rc6 (2019-05-05)


  • Backwards-incompatible: Remove support for Python 2 (#1120). Only Python>=3.5 is supported. Thank you @rooterkyberian for the suggestion and the PR.

  • Backwards-incompatible: Remove special-casing in fields.List and fields.Tuple for accessing nested attributes (#1188). Use fields.List(fields.Pluck(...)) instead.

  • Add python_requires to (#1194). Thanks @hugovk.

  • Upgrade syntax with pyupgrade in pre-commit (#1195). Thanks again @hugovk.

3.0.0rc5 (2019-03-30)


  • Allow input value to be included in error messages for a number of fields (#1129). Thanks @hdoupe for the PR.

  • Improve default error messages for OneOf and ContainsOnly (#885). Thanks @mcgfeller for the suggestion and @maxalbert for the PR.


  • Remove fields.FormattedString (#1141). Use fields.Function or fields.Method instead.

Bug fixes:

  • Includes bug fix from 2.19.2.

3.0.0rc4 (2019-02-08)


  • Add fields.Tuple (#1103) Thanks @zblz for the PR.

  • Add fields.Mapping, which makes it easier to support other mapping types (e.g. OrderedDict) (#1092). Thank @sayanarijit for the suggestion and the PR.

3.0.0rc3 (2019-01-13)


  • Make the error messages for “unknown fields” and “invalid data type” configurable (#852). Thanks @Dunstrom for the PR.

  • fields.Boolean parses "yes"/"no" values (#1081). Thanks @r1b.

Other changes:

  • Backwards-incompatible with previous 3.x versions: Change ordering of keys and values arguments to fields.Dict.

  • Remove unused code in marshmallow.utils: is_indexable_but_not_string, float_to_decimal, decimal_to_fixed, from_iso (#1088).

  • Remove unused marshmallow.compat.string_types.

Bug fixes:

  • Includes bug fix from 2.18.0.

3.0.0rc2 (2019-01-03)


  • Add register class Meta option to allow bypassing marshmallow’s internal class registry when memory usage is critical (#660).

Bug fixes:

  • Fix serializing dict-like objects with properties (#1060). Thanks @taion for the fix.

  • Fix populating ValidationError.valid_data for List and Dict fields (#766).

Other changes:

  • Add marshmallow.__version_info__ (#1074).

  • Remove the marshmallow.marshalling internal module (#1070).

  • A ValueError is raised when the missing parameter is passed for required fields (#1040).

  • Extra keyword arguments passed to ValidationError in validators are no longer passed to the final ValidationError raised upon validation completion (#996).

3.0.0rc1 (2018-11-29)


  • Backwards-incompatible: Rework ValidationError API. It now expects a single field name, and error structures are merged in the final ValidationError raised when validation completes. This allows schema-level validators to raise errors for individual fields (#441). Thanks @maximkulkin for writing the original merge_errors implementation in #442 and thanks @lafrech for completing the implementation in #1026.

Bug fixes:

  • Fix TypeError when serializing None with Pluck (#1049). Thanks @toffan for the catch and patch.

3.0.0b20 (2018-11-01)

Bug fixes:

  • Includes bug fixes from 2.16.2 and 2.16.3.

3.0.0b19 (2018-10-24)


  • Support partial loading of nested fields (#438). Thanks @arbor-dwatson for the PR. Note: Subclasses of fields.Nested now take an additional partial parameter in the _deserialize method.

Bug fixes:

  • Restore Schema.TYPE_MAPPING, which was removed in 3.0.0b17 (#1012).

Other changes:

  • Backwards-incompatible: _serialize and _deserialize methods of

all fields.Field subclasses must accept **kwargs (#1007).

3.0.0b18 (2018-10-15)

Bug fixes:

  • Fix Date deserialization when using custom format (#1001). Thanks @Ondkloss for reporting.


  • prefix parameter or Schema class is removed (#991). The same can be achieved using a @post_dump method.

3.0.0b17 (2018-10-13)


  • Add format option to Date field (#869).

  • Backwards-incompatible: Rename DateTime’s dateformat Meta option to datetimeformat. dateformat now applies to Date (#869). Thanks @knagra for implementing these changes.

  • Enforce ISO 8601 when deserializing date and time (#899). Thanks @dushr for the report and the work on the PR.

  • Backwards-incompatible: Raise ValueError on Schema instantiation in case of attribute or data_key collision (#992).

Bug fixes:

  • Fix inconsistencies in field inference by refactoring the inference feature into a dedicated field (#809). Thanks @taion for the PR.

  • When unknown is not passed to Nested, default to nested Schema unknown meta option rather than RAISE (#963). Thanks @vgavro for the PR.

  • Fix loading behavior of fields.Pluck (#990).

  • Includes bug fix from 2.16.0.

3.0.0b16 (2018-09-20)

Bug fixes:

  • Fix root attribute for nested container fields on inheriting schemas (#956). Thanks @bmcbu for reporting.

3.0.0b15 (2018-09-18)

Bug fixes:

  • Raise ValidationError instead of TypeError when non-iterable types are validated with many=True (#851).

  • many=True no longer iterates over str and objects and instead raises a ValidationError with {'_schema': ['Invalid input type.']} (#930).

  • Return [] as ValidationError.valid_data instead of {} when many=True (#907).

Thanks @tuukkamustonen for implementing these changes.

3.0.0b14 (2018-09-15)


  • Add fields.Pluck for serializing a single field from a nested object (#800). Thanks @timc13 for the feedback and @deckar01 for the implementation.

  • Backwards-incompatible: Passing a string argument as only to fields.Nested is no longer supported. Use fields.Pluck instead (#800).

  • Raise a StringNotCollectionError if only or exclude is passed as a string to fields.Nested (#931).

  • Backwards-incompatible: Float takes an allow_nan parameter to explicitly allow serializing and deserializing special values (nan, inf and -inf). allow_nan defaults to False.

Other changes:

  • Backwards-incompatible: Nested field now defaults to unknown=RAISE instead of EXCLUDE. This harmonizes behavior with Schema that already defaults to RAISE (#908). Thanks @tuukkamustonen.

  • Tested against Python 3.7.

3.0.0b13 (2018-08-04)

Bug fixes:

  • Errors reported by a schema-level validator for a field in a Nested field are stored under corresponding field name, not _schema key (#862).

  • Includes bug fix from 2.15.4.

Other changes:

  • Backwards-incompatible: The unknown option now defaults to RAISE (#524 (comment), #851).

  • Backwards-incompatible: When a schema error is raised with a dict as payload, the dict overwrites any existing error list. Before this change, it would be appended to the list.

  • Raise a StringNotCollectionError if only or exclude is passed as a string (#316). Thanks @paulocheque for reporting.

3.0.0b12 (2018-07-04)


  • The behavior to apply when encountering unknown fields while deserializing can be controlled with the unknown option (#524, #747, #127). It makes it possible to either “include”, “exclude”, or “raise”. Thanks @tuukkamustonen for the suggestion and thanks @ramnes for the PR.


The default for unknown will be changed to RAISE in the next release.

Other changes:

  • Backwards-incompatible: Pre/Post-processors MUST return modified data. Returning None does not imply data were mutated (#347). Thanks @tdevelioglu for reporting.

  • Backwards-incompatible: only and exclude are bound by declared and additional fields. A ValueError is raised if invalid fields are passed (#636). Thanks @jan-23 for reporting. Thanks @ikilledthecat and @deckar01 for the PRs.

  • Format code using pre-commit (#855).


  • ValidationError.fields is removed (#840). Access field instances from Schema.fields.

3.0.0b11 (2018-05-20)


  • Clean up code for schema hooks (#814). Thanks @taion.

  • Minor performance improvement from simplifying utils.get_value (#811). Thanks again @taion.

  • Add require_tld argument to fields.URL (#749). Thanks @DenerKup for reporting and thanks @surik00 for the PR.

  • fields.UUID deserializes bytes strings using UUID(bytes=b'...') (#625). Thanks @JeffBerger for the suggestion and the PR.

Bug fixes:

  • Fields nested within Dict correctly inherit context from their parent schema (#820). Thanks @RosanneZe for reporting and @deckar01 for the PR.

  • Includes bug fix from 2.15.3.

3.0.0b10 (2018-05-10)

Bug fixes:

  • Includes bugfixes from 2.15.2.

3.0.0b9 (2018-04-25)


  • Backwards-incompatible: missing and default values are passed in deserialized form (#378). Thanks @chadrik for the suggestion and thanks @lafrech for the PR.

Bug fixes:

  • Includes the bugfix from 2.15.1.

3.0.0b8 (2018-03-24)


  • Backwards-incompatible: Add data_key parameter to fields for specifying the key in the input and output data dict. This parameter replaces both load_from and dump_to (#717). Thanks @lafrech.

  • Backwards-incompatible: When pass_original=True is passed to one of the decorators and a collection is being (de)serialized, the original_data argument will be a single object unless pass_many=True is also passed to the decorator (#315, #743). Thanks @stj for the PR.

  • Backwards-incompatible: Don’t recursively check nested required fields when the Nested field’s key is missing (#319). This reverts #235. Thanks @chekunkov reporting and thanks @lafrech for the PR.

  • Backwards-incompatible: Change error message collection for Dict field (#730). Note: this is backwards-incompatible with previous 3.0.0bX versions. Thanks @shabble for the report and thanks @lafrech for the PR.

3.0.0b7 (2018-02-03)


  • Backwards-incompatible: Schemas are always strict (#377). The strict parameter is removed.

  • Backwards-incompatible: Schema().load and Schema().dump return data instead of a (data, errors) tuple (#598).

  • Backwards-incomaptible: Schema().load(None) raises a ValidationError (#511).

See Upgrading to 3.0 for a guide on updating your code.

Thanks @lafrech for implementing these changes. Special thanks to @MichalKononenko, @douglas-treadwell, and @maximkulkin for the discussions on these changes.

Other changes:

  • Backwards-incompatible: Field name is not checked when load_from is specified (#714). Thanks @lafrech.


3.0.0b6 (2018-01-02)

Bug fixes:

  • Fixes ValidationError.valid_data when a nested field contains errors (#710). This bug was introduced in 3.0.0b3. Thanks @lafrech.

Other changes:

  • Backwards-incompatible: Email and URL fields don’t validate on serialization (#608). This makes them more consistent with the other fields and improves serialization performance. Thanks again @lafrech.

  • validate.URL requires square brackets around IPv6 URLs (#707). Thanks @harlov.

3.0.0b5 (2017-12-30)


  • Add support for structured dictionaries by providing values and keys arguments to the Dict field’s constructor. This mirrors the List field’s ability to validate its items (#483). Thanks @deckar01.

Other changes:

  • Backwards-incompatible: utils.from_iso is deprecated in favor of utils.from_iso_datetime (#694). Thanks @sklarsa.

3.0.0b4 (2017-10-23)


  • Add support for millisecond, minute, hour, and week precisions to fields.TimeDelta (#537). Thanks @Fedalto for the suggestion and the PR.

  • Includes features from release 2.14.0.


  • Copyright year in docs uses CHANGELOG.rst’s modified date for reproducible builds (#679). Thanks @bmwiedemann.

  • Test against Python 3.6 in tox. Thanks @Fedalto.

  • Fix typo in exception message (#659). Thanks @wonderbeyond for reporting and thanks @yoichi for the PR.

3.0.0b3 (2017-08-20)


  • Add valid_data attribute to ValidationError.

  • Add strict parameter to Integer (#667). Thanks @yoichi.


  • Deprecate json_module option in favor of render_module (#364, #130). Thanks @justanr for the suggestion.

Bug fixes:

  • Includes bug fixes from releases 2.13.5 and 2.13.6.

  • Backwards-incompatible: Number fields don’t accept booleans as valid input (#623). Thanks @tuukkamustonen for the suggestion and thanks @rowillia for the PR.


3.0.0b2 (2017-03-19)


  • Add truthy and falsy params to fields.Boolean (#580). Thanks @zwack for the PR. Note: This is potentially a breaking change if your code passes the default parameter positionally. Pass default as a keyword argument instead, e.g. fields.Boolean(default=True).

Other changes:

  • Backwards-incompatible: validate.ContainsOnly allows empty and duplicate values (#516, #603). Thanks @maximkulkin for the suggestion and thanks @lafrech for the PR.

Bug fixes:

  • Includes bug fixes from release 2.13.4.

3.0.0b1 (2017-03-10)


  • fields.Nested respects only='field' when deserializing (#307). Thanks @erlingbo for the suggestion and the PR.

  • fields.Boolean parses "on"/"off" (#580). Thanks @marcellarius for the suggestion.

Other changes:

  • Includes changes from release 2.13.2.

  • Backwards-incompatible: skip_on_field_errors defaults to True for validates_schema (#352).

3.0.0a1 (2017-02-26)


  • dump_only and load_only for Function and Method are set based on serialize and deserialize arguments (#328).

Other changes:

  • Backwards-incompatible: fields.Method and fields.Function no longer swallow AttributeErrors (#395). Thanks @bereal for the suggestion.

  • Backwards-incompatible: validators.Length is no longer a subclass of validators.Range (#458). Thanks @deckar01 for the catch and patch.

  • Backwards-incompatible: utils.get_func_args no longer returns bound arguments. This is consistent with the behavior of inspect.signature. This change prevents a DeprecationWarning on Python 3.5 (#415, #479). Thanks @deckar01 for the PR.

  • Backwards-incompatible: Change the signature of utils.get_value and Schema.get_attribute for consistency with Python builtins (e.g. getattr) (#341). Thanks @stas for reporting and thanks @deckar01 for the PR.

  • Backwards-incompatible: Don’t unconditionally call callable attributes (#430, reverts #242). Thanks @mirko for the suggestion.

  • Drop support for Python 2.6 and 3.3.


  • Remove __error_handler__, __accessor__, @Schema.error_handler, and @Schema.accessor. Override Schema.handle_error and Schema.get_attribute instead.

  • Remove func parameter of fields.Function. Remove method_name parameter of fields.Method (issue:325). Use the serialize parameter instead.

  • Remove extra parameter from Schema. Use a @post_dump method to add additional data.

2.21.0 (2020-03-05)

Bug fixes:

  • Don’t match string-ending newlines in URL and Email fields (#1522). Thanks @nbanmp for the PR.

Other changes:

  • Drop support for Python 3.4 (#1525).

2.20.5 (2019-09-15)

Bug fixes:

  • Fix behavior when a non-list collection is passed to the validate argument of fields.Email and fields.URL (#1400).

2.20.4 (2019-09-11)

Bug fixes:

  • Respect the many value on Schema instances passed to Nested (#1160). Thanks @Kamforka for reporting.

2.20.3 (2019-09-04)

Bug fixes:

  • Don’t swallow TypeError exceptions raised by Field._bind_to_schema or Schema.on_bind_field (#1376).

2.20.2 (2019-08-20)

Bug fixes:

  • Prevent warning about importing from collections on Python 3.7 (#1354). Thanks @nicktimko for the PR.

2.20.1 (2019-08-13)

Bug fixes:

  • Fix bug that raised TypeError when invalid data type is passed to a nested schema with @validates (#1342).

2.20.0 (2019-08-10)

Bug fixes:

  • Fix deprecated functions’ compatibility with Python 2 (#1337). Thanks @airstandley for the catch and patch.

  • Fix error message consistency for invalid input types on nested fields (#1303). This is a backport of the fix in #857. Thanks @cristi23 for the thorough bug report and the PR.


  • Python 2.6 is no longer officially supported (#1274).

2.19.5 (2019-06-18)

Bug fixes:

  • Fix deserializing ISO8601-formatted datetimes with less than 6-digit miroseconds (#1251). Thanks @diego-plan9 for reporting.

2.19.4 (2019-06-16)

Bug fixes:

  • Microseconds no longer gets lost when deserializing datetimes without dateutil installed (#1147).

2.19.3 (2019-06-15)

Bug fixes:

  • Fix bug where nested fields in Meta.exclude would not work on multiple instantiations (#1212). Thanks @MHannila for reporting.

2.19.2 (2019-03-30)

Bug fixes:

  • Handle OverflowError when (de)serializing large integers with fields.Float (#1177). Thanks @brycedrennan for the PR.

2.19.1 (2019-03-16)

Bug fixes:

  • Fix bug where Nested(many=True) would skip first element when serializing a generator (#1163). Thanks @khvn26 for the catch and patch.

2.19.0 (2019-03-07)


  • A RemovedInMarshmallow3 warning is raised when using fields.FormattedString. Use fields.Method or fields.Function instead (#1141).

2.18.1 (2019-02-15)

Bug fixes:

  • A ChangedInMarshmallow3Warning is no longer raised when strict=False (#1108). Thanks @Aegdesil for reporting.

2.18.0 (2019-01-13)


  • Add warnings for functions in marshmallow.utils that are removed in marshmallow 3.

Bug fixes:

  • Copying missing with copy.copy or copy.deepcopy will not duplicate it (#1099).

2.17.0 (2018-12-26)


  • Add marshmallow.__version_info__ (#1074).

  • Add warnings for API that is deprecated or changed to help users prepare for marshmallow 3 (#1075).

2.16.3 (2018-11-01)

Bug fixes:

  • Prevent memory leak when dynamically creating classes with type() (#732). Thanks @asmodehn for writing the tests to reproduce this issue.

2.16.2 (2018-10-30)

Bug fixes:

  • Prevent warning about importing from collections on Python 3.7 (#1027). Thanks @nkonin for reporting and @jmargeta for the PR.

2.16.1 (2018-10-17)

Bug fixes:

  • Remove spurious warning about implicit collection handling (#998). Thanks @lalvarezguillen for reporting.

2.16.0 (2018-10-10)

Bug fixes:

  • Allow username without password in basic auth part of the url in fields.Url (#982). Thanks user:alefnula for the PR.

Other changes:

  • Drop support for Python 3.3 (#987).

2.15.6 (2018-09-20)

Bug fixes:

  • Prevent TypeError when a non-collection is passed to a Schema with many=True. Instead, raise ValidationError with {'_schema': ['Invalid input type.']} (#906).

  • Fix root attribute for nested container fields on list on inheriting schemas (#956). Thanks @bmcbu for reporting.

These fixes were backported from 3.0.0b15 and 3.0.0b16.

2.15.5 (2018-09-15)

Bug fixes:

  • Handle empty SQLAlchemy lazy lists gracefully when dumping (#948). Thanks @vke-code for the catch and @YuriHeupa for the patch.

2.15.4 (2018-08-04)

Bug fixes:

  • Respect load_from when reporting errors for @validates('field_name') (#748). Thanks @m-novikov for the catch and patch.

2.15.3 (2018-05-20)

Bug fixes:

  • Fix passing only as a string to nested when the passed field defines dump_to (#800, #822). Thanks @deckar01 for the catch and patch.

2.15.2 (2018-05-10)

Bug fixes:

  • Fix a race condition in validation when concurrent threads use the same Schema instance (#783). Thanks @yupeng0921 and @lafrech for the fix.

  • Fix serialization behavior of fields.List(fields.Integer(as_string=True)) (#788). Thanks @cactus for reporting and @lafrech for the fix.

  • Fix behavior of exclude parameter when passed from parent to nested schemas (#728). Thanks @timc13 for reporting and @deckar01 for the fix.

2.15.1 (2018-04-25)

Bug fixes:

2.15.0 (2017-12-02)

Bug fixes:

2.14.0 (2017-10-23)


  • Add require_tld parameter to validate.URL (#664). Thanks @sduthil for the suggestion and the PR.

2.13.6 (2017-08-16)

Bug fixes:

2.13.5 (2017-04-12)

Bug fixes:

  • Fix validation of iso8601-formatted dates (#556). Thanks @lafrech for reporting.

2.13.4 (2017-03-19)

Bug fixes:

  • Fix symmetry of serialization and deserialization behavior when passing a dot-delimited path to the attribute parameter of fields (#450). Thanks @itajaja for reporting.

2.13.3 (2017-03-11)

Bug fixes:

  • Restore backwards-compatibility of SchemaOpts constructor (#597). Thanks @Wesmania for reporting and thanks @frol for the fix.

2.13.2 (2017-03-10)

Bug fixes:

  • Fix inheritance of ordered option when Schema subclasses define class Meta (#593). Thanks @frol.


  • Update contributing docs.

2.13.1 (2017-03-04)

Bug fixes:

  • Fix sorting on Schema subclasses when ordered=True (#592). Thanks @frol.

2.13.0 (2017-02-18)


2.12.2 (2017-01-30)

Bug fixes:

  • Unbound fields return None rather returning the field itself. This fixes a corner case introduced in #572. Thanks @touilleMan for reporting and @YuriHeupa for the fix.

2.12.1 (2017-01-23)

Bug fixes:

  • Fix behavior when a Nested field is composed within a List field (#572). Thanks @avish for reporting and @YuriHeupa for the PR.

2.12.0 (2017-01-22)


  • Allow passing nested attributes (e.g. 'child.field') to the dump_only and load_only parameters of Schema (#572). Thanks @YuriHeupa for the PR.

  • Add schemes parameter to fields.URL (#574). Thanks @mosquito for the PR.

2.11.1 (2017-01-08)

Bug fixes:

2.11.0 (2017-01-08)


  • Import marshmallow.fields in marshmallow/ to save an import when importing the marshmallow module (#557). Thanks @mindojo-victor.


  • Documentation: Improve example in “Validating Original Input Data” (#558). Thanks @altaurog.

  • Test against Python 3.6.

2.10.5 (2016-12-19)

Bug fixes:

  • Reset user-defined kwargs passed to ValidationError on each Schema.load call (#565). Thanks @jbasko for the catch and patch.


  • Tests: Fix redefinition of test_utils.test_get_value() (#562). Thanks @nelfin.

2.10.4 (2016-11-18)

Bug fixes:

2.10.3 (2016-10-02)

Bug fixes:

  • Fix behavior for serializing missing data with Number fields when as_string=True is passed (#538). Thanks @jessemyers for reporting.

2.10.2 (2016-09-25)

Bug fixes:

  • Use fixed-point notation rather than engineering notation when serializing with Decimal (#534). Thanks @gdub.

  • Fix UUID validation on serialization and deserialization of uuid.UUID objects (#532). Thanks @pauljz.

2.10.1 (2016-09-14)

Bug fixes:

  • Fix behavior when using validate.Equal(False) (#484). Thanks @pktangyue for reporting and thanks @tuukkamustonen for the fix.

  • Fix strict behavior when errors are raised in pre_dump/post_dump processors (#521). Thanks @tvuotila for the catch and patch.

  • Fix validation of nested fields on dumping (#528). Thanks again @tvuotila.

2.10.0 (2016-09-05)


  • Errors raised by pre/post-load/dump methods will be added to a schema’s errors dictionary (#472). Thanks @dbertouille for the suggestion and for the PR.

2.9.1 (2016-07-21)

Bug fixes:

  • Fix serialization of datetime.time objects with microseconds (#464). Thanks @Tim-Erwin for reporting and thanks @vuonghv for the fix.

  • Make @validates consistent with field validator behavior: if validation fails, the field will not be included in the deserialized output (#391). Thanks @martinstein for reporting and thanks @vuonghv for the fix.

2.9.0 (2016-07-06)

  • Decimal field coerces input values to a string before deserializing to a decimal.Decimal object in order to avoid transformation of float values under 12 significant digits (#434, #435). Thanks @davidthornton for the PR.

2.8.0 (2016-06-23)


  • Allow only and exclude parameters to take nested fields, using dot-delimited syntax (e.g. only=['']) (#402). Thanks @Tim-Erwin and @deckar01 for the discussion and implementation.


  • Update for compatibility with invoke>=0.13.0. Thanks @deckar01.

2.7.3 (2016-05-05)

  • Make field.parent and accessible to on_bind_field (#449). Thanks @immerrr.

2.7.2 (2016-04-27)

No code changes in this release. This is a reupload in order to distribute an sdist for the last hotfix release. See #443.


  • Update license entry in to fix RPM distributions (#433). Thanks @rrajaravi for reporting.

2.7.1 (2016-04-08)

Bug fixes:

  • Only add Schemas to class registry if a class name is provided. This allows Schemas to be constructed dynamically using the type constructor without getting added to the class registry (which is useful for saving memory).

2.7.0 (2016-04-04)


  • Make context available to Nested field’s on_bind_field method (#408). Thanks @immerrr for the PR.

  • Pass through user ValidationError kwargs (#418). Thanks @russelldavies for helping implement this.

Other changes:

  • Remove unused attributes root, parent, and name from SchemaABC (#410). Thanks @Tim-Erwin for the PR.

2.6.1 (2016-03-17)

Bug fixes:

  • Respect load_from when reporting errors for nested required fields (#414). Thanks @yumike.

2.6.0 (2016-02-01)


  • Add partial argument to Schema.validate (#379). Thanks @tdevelioglu for the PR.

  • Add equal argument to validate.Length. Thanks @daniloakamine.

  • Collect all validation errors for each item deserialized by a List field (#345). Thanks @maximkulkin for the report and the PR.

2.5.0 (2016-01-16)


  • Allow a tuple of field names to be passed as the partial argument to Schema.load (#369). Thanks @tdevelioglu for the PR.

  • Add schemes argument to validate.URL (#356).

2.4.2 (2015-12-08)

Bug fixes:

  • Prevent duplicate error messages when validating nested collections (#360). Thanks @alexmorken for the catch and patch.

2.4.1 (2015-12-07)

Bug fixes:

2.4.0 (2015-12-06)


Bug fixes:

  • Fix FormattedString serialization (#348). Thanks @acaird for reporting.

  • Fix @validates behavior when used when attribute is specified and strict=True (#350). Thanks @density for reporting.

2.3.0 (2015-11-22)


  • Add dump_to parameter to fields (#310). Thanks @ShayanArmanPercolate for the suggestion. Thanks @franciscod and @ewang for the PRs.

  • The deserialize function passed to fields.Function can optionally receive a context argument (#324). Thanks @DamianHeard.

  • The serialize function passed to fields.Function is optional (#325). Thanks again @DamianHeard.

  • The serialize function passed to fields.Method is optional (#329). Thanks @justanr.


  • The func argument of fields.Function has been renamed to serialize.

  • The method_name argument of fields.Method has been renamed to serialize.

func and method_name are still present for backwards-compatibility, but they will both be removed in marshmallow 3.0.

2.2.1 (2015-11-11)

Bug fixes:

2.2.0 (2015-10-26)


  • Add support for partial deserialization with the partial argument to Schema and Schema.load (#290). Thanks @taion.


  • Query and QuerySelect fields are removed.

  • Passing of strings to required and allow_none is removed. Pass the error_messages argument instead.


  • Add example of Schema inheritance in docs (#225). Thanks @martinstein for the suggestion and @juanrossi for the PR.

  • Add “Customizing Error Messages” section to custom fields docs.

2.1.3 (2015-10-18)

Bug fixes:

  • Fix serialization of collections for which iter will modify position, e.g. Pymongo cursors (#303). Thanks @Mise for the catch and patch.

2.1.2 (2015-10-14)

Bug fixes:

  • Fix passing data to schema validator when using @validates_schema(many=True) (#297). Thanks @d-sutherland for reporting.

  • Fix usage of @validates with a nested field when many=True (#298). Thanks @nelfin for the catch and patch.

2.1.1 (2015-10-07)

Bug fixes:

  • Constant field deserializes to its value regardless of whether its field name is present in input data (#291). Thanks @fayazkhan for reporting.

2.1.0 (2015-09-30)


  • Add Dict field for arbitrary mapping data (#251). Thanks @dwieeb for adding this and @Dowwie for the suggestion.

  • Add Field.root property, which references the field’s Schema.


  • The extra param of Schema is deprecated. Add extra data in a post_load method instead.

  • UnmarshallingError and MarshallingError are removed.

Bug fixes:

  • Fix storing multiple schema-level validation errors (#287). Thanks @evgeny-sureev for the patch.

  • If missing=None on a field, allow_none will be set to True.

Other changes:

  • A List's inner field will have the list field set as its parent. Use root to access the Schema.

2.0.0 (2015-09-25)


  • Make error messages configurable at the class level and instance level (Field.default_error_messages attribute and error_messages parameter, respectively).


  • Remove make_object. Use a post_load method instead (#277).

  • Remove the error parameter and attribute of Field.

  • Passing string arguments to required and allow_none is deprecated. Pass the error_messages argument instead. This API will be removed in version 2.2.

  • Remove Arbitrary, Fixed, and Price fields (#86). Use Decimal instead.

  • Remove Select / Enum fields (#135). Use the OneOf validator instead.

Bug fixes:

  • Fix error format for Nested fields when many=True. Thanks @alexmorken.

  • pre_dump methods are invoked before implicit field creation. Thanks @makmanalp for reporting.

  • Return correct “required” error message for Nested field.

  • The only argument passed to a Schema is bounded by the fields option (#183). Thanks @lustdante for the suggestion.

Changes from 2.0.0rc2:

  • error_handler and accessor options are replaced with the handle_error and get_attribute methods #284.

  • Remove marshmallow.compat.plain_function since it is no longer used.

  • Non-collection values are invalid input for List field (#231). Thanks @density for reporting.

  • Bug fix: Prevent infinite loop when validating a required, self-nested field. Thanks @Bachmann1234 for the fix.

2.0.0rc2 (2015-09-16)


  • make_object is deprecated. Use a post_load method instead (#277). This method will be removed in the final 2.0 release.

  • Schema.accessor and Schema.error_handler decorators are deprecated. Define the accessor and error_handler class Meta options instead.

Bug fixes:

  • Allow non-field names to be passed to ValidationError (#273). Thanks @evgeny-sureev for the catch and patch.

Changes from 2.0.0rc1:

  • The raw parameter of the pre_*, post_*, validates_schema decorators was renamed to pass_many (#276).

  • Add pass_original parameter to post_load and post_dump (#216).

  • Methods decorated with the pre_*, post_*, and validates_* decorators must be instance methods. Class methods and instance methods are not supported at this time.

2.0.0rc1 (2015-09-13)


  • Backwards-incompatible: fields.Field._deserialize now takes attr and data as arguments (#172). Thanks @alexmic and @kevinastone for the suggestion.

  • Allow a Field's attribute to be modified during deserialization (#266). Thanks @floqqi.

  • Allow partially-valid data to be returned for Nested fields (#269). Thanks @jomag for the suggestion.

  • Add Schema.on_bind_field hook which allows a Schema to modify its fields when they are bound.

  • Stricter validation of string, boolean, and number fields (#231). Thanks @touilleMan for the suggestion.

  • Improve consistency of error messages.


  • Schema.validator, Schema.preprocessor, and Schema.data_handler are removed. Use validates_schema, pre_load, and post_dump instead.

  • QuerySelect and QuerySelectList are deprecated (#227). These fields will be removed in version 2.1.

  • utils.get_callable_name is removed.

Bug fixes:

  • If a date format string is passed to a DateTime field, it is always used for deserialization (#248). Thanks @bartaelterman and @praveen-p.


  • Documentation: Add “Using Context” section to “Extending Schemas” page (#224).

  • Include tests and docs in release tarballs (#201).

  • Test against Python 3.5.

2.0.0b5 (2015-08-23)


  • If a field corresponds to a callable attribute, it will be called upon serialization. Thanks @alexmorken.

  • Add load_only and dump_only class Meta options. Thanks @kelvinhammond.

  • If a Nested field is required, recursively validate any required fields in the nested schema (#235). Thanks @max-orhai.

  • Improve error message if a list of dicts is not passed to a Nested field for which many=True. Thanks again @max-orhai.

Bug fixes:

  • make_object is only called after all validators and postprocessors have finished (#253). Thanks @sunsongxp for reporting.

  • If an invalid type is passed to Schema and strict=False, store a _schema error in the errors dict rather than raise an exception (#261). Thanks @density for reporting.

Other changes:

  • make_object is only called when input data are completely valid (#243). Thanks @kissgyorgy for reporting.

  • Change default error messages for URL and Email validators so that they don’t include user input (#255).

  • Email validator permits email addresses with non-ASCII characters, as per RFC 6530 (#221). Thanks @lextoumbourou for reporting and @mwstobo for sending the patch.

2.0.0b4 (2015-07-07)


  • List field respects the attribute argument of the inner field. Thanks @jmcarp.

  • The container field List field has access to its parent Schema via its parent attribute. Thanks again @jmcarp.


  • Legacy validator functions have been removed (#73). Use the class-based validators in marshmallow.validate instead.

Bug fixes:

  • fields.Nested correctly serializes nested sets (#233). Thanks @traut.

Changes from 2.0.0b3:

  • If load_from is used on deserialization, the value of load_from is used as the key in the errors dict (#232). Thanks @alexmorken.

2.0.0b3 (2015-06-14)


  • Add marshmallow.validates_schema decorator for defining schema-level validators (#116).

  • Add marshmallow.validates decorator for defining field validators as Schema methods (#116). Thanks @philtay.

  • Performance improvements.

  • Defining __marshallable__ on complex objects is no longer necessary.

  • Add fields.Constant. Thanks @kevinastone.


  • Remove skip_missing class Meta option. By default, missing inputs are excluded from serialized output (#211).

  • Remove optional context parameter that gets passed to methods for Method fields.

  • Schema.validator is deprecated. Use marshmallow.validates_schema instead.

  • utils.get_func_name is removed. Use utils.get_callable_name instead.

Bug fixes:

  • Fix serializing values from keyed tuple types (regression of #28). Thanks @makmanalp for reporting.

Other changes:

  • Remove unnecessary call to utils.get_value for Function and Method fields (#208). Thanks @jmcarp.

  • Serializing a collection without passing many=True will not result in an error. Be very careful to pass the many argument when necessary.


  • Documentation: Update Flask and Peewee examples. Update Quickstart.

Changes from 2.0.0b2:

  • Boolean field serializes None to None, for consistency with other fields (#213). Thanks @cmanallen for reporting.

  • Bug fix: load_only fields do not get validated during serialization.

  • Implicit passing of original, raw data to Schema validators is removed. Use @marshmallow.validates_schema(pass_original=True) instead.

2.0.0b2 (2015-05-03)


  • Add useful __repr__ methods to validators (#204). Thanks @philtay.

  • Backwards-incompatible: By default, NaN, Infinity, and -Infinity are invalid values for fields.Decimal. Pass allow_nan=True to allow these values. Thanks @philtay.

Changes from 2.0.0b1:

  • Fix serialization of None for Time, TimeDelta, and Date fields (a regression introduced in 2.0.0a1).

Includes bug fixes from 1.2.6.

2.0.0b1 (2015-04-26)


  • Errored fields will not appear in (de)serialized output dictionaries (#153, #202).

  • Instantiate OPTIONS_CLASS in SchemaMeta. This makes Schema.opts available in metaclass methods. It also causes validation to occur earlier (upon Schema class declaration rather than instantiation).

  • Add SchemaMeta.get_declared_fields class method to support adding additional declared fields.


  • Remove allow_null parameter of fields.Nested (#203).

Changes from 2.0.0a1:

  • Fix serialization of None for fields.Email.

2.0.0a1 (2015-04-25)


  • Backwards-incompatible: When many=True, the errors dictionary returned by dump and load will be keyed on the indices of invalid items in the (de)serialized collection (#75). Add index_errors=False on a Schema’s class Meta options to disable this behavior.

  • Backwards-incompatible: By default, fields will raise a ValidationError if the input is None. The allow_none parameter can override this behavior.

  • Backwards-incompatible: A Field's default parameter is only used if explicitly set and the field’s value is missing in the input to Schema.dump. If not set, the key will not be present in the serialized output for missing values . This is the behavior for all fields. fields.Str no longer defaults to '', fields.Int no longer defaults to 0, etc. (#199). Thanks @jmcarp for the feedback.

  • In strict mode, a ValidationError is raised. Error messages are accessed via the ValidationError's messages attribute (#128).

  • Add allow_none parameter to fields.Field. If False (the default), validation fails when the field’s value is None (#76, #111). If allow_none is True, None is considered valid and will deserialize to None.

  • Schema-level validators can store error messages for multiple fields (#118). Thanks @ksesong for the suggestion.

  • Add pre_load, post_load, pre_dump, and post_dump Schema method decorators for defining pre- and post- processing routines (#153, #179). Thanks @davidism, @taion, and @jmcarp for the suggestions and feedback. Thanks @taion for the implementation.

  • Error message for required validation is configurable. (#78). Thanks @svenstaro for the suggestion. Thanks @0xDCA for the implementation.

  • Add load_from parameter to fields (#125). Thanks @hakjoon.

  • Add load_only and dump_only parameters to fields (#61, #87). Thanks @philtay.

  • Add missing parameter to fields (#115). Thanks @philtay.

  • Schema validators can take an optional raw_data argument which contains raw input data, incl. data not specified in the schema (#127). Thanks @ryanlowe0.

  • Add validate.OneOf (#135) and validate.ContainsOnly (#149) validators. Thanks @philtay.

  • Error messages for validators can be interpolated with {input} and other values (depending on the validator).

  • fields.TimeDelta always serializes to an integer value in order to avoid rounding errors (#105). Thanks @philtay.

  • Add include class Meta option to support field names which are Python keywords (#139). Thanks @nickretallack for the suggestion.

  • exclude parameter is respected when used together with only parameter (#165). Thanks @lustdante for the catch and patch.

  • fields.List works as expected with generators and sets (#185). Thanks @sergey-aganezov-jr.


  • MarshallingError and UnmarshallingError error are deprecated in favor of a single ValidationError (#160).

  • context argument passed to Method fields is deprecated. Use self.context instead (#184).

  • Remove ForcedError.

  • Remove support for generator functions that yield validators (#74). Plain generators of validators are still supported.

  • The Select/Enum field is deprecated in favor of using validate.OneOf validator (#135).

  • Remove legacy, pre-1.0 API ( and Schema.errors properties) (#73).

  • Remove null value.

Other changes:

  • Marshaller, Unmarshaller were moved to marshmallow.marshalling. These should be considered private API (#129).

  • Make allow_null=True the default for Nested fields. This will make None serialize to None rather than a dictionary with empty values (#132). Thanks @nickrellack for the suggestion.

1.2.6 (2015-05-03)

Bug fixes:

  • Fix validation error message for fields.Decimal.

  • Allow error message for fields.Boolean to be customized with the error parameter (like other fields).

1.2.5 (2015-04-25)

Bug fixes:

  • Fix validation of invalid types passed to a Nested field when many=True (#188). Thanks @juanrossi for reporting.


  • Fix pep8 dev dependency for flake8. Thanks @taion.

1.2.4 (2015-03-22)

Bug fixes:

  • Fix behavior of as_string on fields.Integer (#173). Thanks @taion for the catch and patch.

Other changes:

  • Remove dead code from fields.Field. Thanks @taion.


  • Correction to _postprocess method in docs. Thanks again @taion.

1.2.3 (2015-03-15)

Bug fixes:

  • Fix inheritance of ordered class Meta option (#162). Thanks @stephenfin for reporting.

1.2.2 (2015-02-23)

Bug fixes:

  • Fix behavior of skip_missing and accessor options when many=True (#137). Thanks @3rdcycle.

  • Fix bug that could cause an AttributeError when nesting schemas with schema-level validators (#144). Thanks @vovanbo for reporting.

1.2.1 (2015-01-11)

Bug fixes:

  • A Schema's error_handler–if defined–will execute if Schema.validate returns validation errors (#121).

  • Deserializing None returns None rather than raising an AttributeError (#123). Thanks @RealSalmon for the catch and patch.

1.2.0 (2014-12-22)


  • Add QuerySelect and QuerySelectList fields (#84).

  • Convert validators in marshmallow.validate into class-based callables to make them easier to use when declaring fields (#85).

  • Add Decimal field which is safe to use when dealing with precise numbers (#86).

Thanks @philtay for these contributions.

Bug fixes:

  • Date fields correctly deserializes to a object when python-dateutil is not installed (#79). Thanks @malexer for the catch and patch.

  • Fix bug that raised an AttributeError when using a class-based validator.

  • Fix as_string behavior of Number fields when serializing to default value.

  • Deserializing None or the empty string with either a DateTime, Date, Time or TimeDelta results in the correct unmarshalling errors (#96). Thanks @svenstaro for reporting and helping with this.

  • Fix error handling when deserializing invalid UUIDs (#106). Thanks @vesauimonen for the catch and patch.

  • Schema.loads correctly defaults to use the value of self.many rather than defaulting to False (#108). Thanks @davidism for the catch and patch.

  • Validators, data handlers, and preprocessors are no longer shared between schema subclasses (#88). Thanks @amikholap for reporting.

  • Fix error handling when passing a dict or list to a ValidationError (#110). Thanks @ksesong for reporting.


  • The validator functions in the validate module are deprecated in favor of the class-based validators (#85).

  • The Arbitrary, Price, and Fixed fields are deprecated in favor of the Decimal field (#86).


  • Update docs theme.

  • Update contributing docs (#77).

  • Fix namespacing example in “Extending Schema” docs. Thanks @Ch00k.

  • Exclude virtualenv directories from syntax checking (#99). Thanks @svenstaro.

1.1.0 (2014-12-02)


  • Add Schema.validate method which validates input data against a schema. Similar to Schema.load, but does not call make_object and only returns the errors dictionary.

  • Add several validation functions to the validate module. Thanks @philtay.

  • Store field name and instance on exceptions raised in strict mode.

Bug fixes:

  • Fix serializing dictionaries when field names are methods of dict (e.g. "items"). Thanks @rozenm for reporting.

  • If a Nested field is passed many=True, None serializes to an empty list. Thanks @nickretallack for reporting.

  • Fix behavior of many argument passed to dump and load. Thanks @svenstaro for reporting and helping with this.

  • Fix skip_missing behavior for String and List fields. Thanks @malexer for reporting.

  • Fix compatibility with python-dateutil 2.3.

  • More consistent error messages across DateTime, TimeDelta, Date, and Time fields.


  • Update Flask and Peewee examples.

1.0.1 (2014-11-18)

Hotfix release.

  • Ensure that errors dictionary is correctly cleared on each call to Schema.dump and Schema.load.

1.0.0 (2014-11-16)

Adds new features, speed improvements, better error handling, and updated documentation.

  • Add skip_missing class Meta option.

  • A field’s default may be a callable.

  • Allow accessor function to be configured via the Schema.accessor decorator or the __accessor__ class member.

  • URL and Email fields are validated upon serialization.

  • dump and load can receive the many argument.

  • Move a number of utility functions from to

  • More useful repr for Field classes.

  • If a field’s default is fields.missing and its serialized value is None, it will not be included in the final serialized result.

  • Schema.dumps no longer coerces its result to a binary string on Python 3.

  • Backwards-incompatible: Schema output is no longer an OrderedDict by default. If you want ordered field output, you must explicitly set the ordered option to True.

  • Backwards-incompatible: error parameter of the Field constructor is deprecated. Raise a ValidationError instead.

  • Expanded test coverage.

  • Updated docs.

1.0.0-a (2014-10-19)

Major reworking and simplification of the public API, centered around support for deserialization, improved validation, and a less stateful Schema class.

  • Rename Serializer to Schema.

  • Support for deserialization.

  • Use the Schema.dump and Schema.load methods for serializing and deserializing, respectively.

  • Backwards-incompatible: Remove Serializer.json and Serializer.to_json. Use Schema.dumps instead.

  • Reworked fields interface.

  • Backwards-incompatible: Field classes implement _serialize and _deserialize methods. serialize and deserialize comprise the public API for a Field. Field.format and Field.output have been removed.

  • Add exceptions.ForcedError which allows errors to be raised during serialization (instead of storing errors in the errors dict).

  • Backwards-incompatible: DateTime field serializes to ISO8601 format by default (instead of RFC822).

  • Backwards-incompatible: Remove Serializer.factory method. It is no longer necessary with the dump method.

  • Backwards-incompatible: Allow nesting a serializer within itself recursively. Use exclude or only to prevent infinite recursion.

  • Backwards-incompatible: Multiple errors can be stored for a single field. The errors dictionary returned by load and dump have lists of error messages keyed by field name.

  • Remove validated decorator. Validation occurs within Field methods.

  • Function field raises a ValueError if an uncallable object is passed to its constructor.

  • Nested fields inherit context from their parent.

  • Add Schema.preprocessor and Schema.validator decorators for registering preprocessing and schema-level validation functions respectively.

  • Custom error messages can be specified by raising a ValidationError within a validation function.

  • Extra keyword arguments passed to a Field are stored as metadata.

  • Fix ordering of field output.

  • Fix behavior of the required parameter on Nested fields.

  • Fix serializing keyed tuple types (e.g. namedtuple) with class Meta options.

  • Fix default value for Fixed and Price fields.

  • Fix serialization of binary strings.

  • Schemas can inherit fields from non-Schema base classes (e.g. mixins). Also, fields are inherited according to the MRO (rather than recursing over base classes). Thanks @jmcarp.

  • Add Str, Bool, and Int field class aliases.

0.7.0 (2014-06-22)

  • Add Serializer.error_handler decorator that registers a custom error handler.

  • Add Serializer.data_handler decorator that registers data post-processing callbacks.

  • Backwards-incompatible: process_data method is deprecated. Use the data_handler decorator instead.

  • Fix bug that raised error when passing extra data together with many=True. Thanks @buttsicles for reporting.

  • If required=True validation is violated for a given Field, it will raise an error message that is different from the message specified by the error argument. Thanks @asteinlein.

  • More generic error message raised when required field is missing.

  • validated decorator should only wrap a Field class’s output method.

0.6.0 (2014-06-03)

  • Fix bug in serializing keyed tuple types, e.g. namedtuple and KeyedTuple.

  • Nested field can load a serializer by its class name as a string. This makes it easier to implement 2-way nesting.

  • Make override-able.

0.5.5 (2014-05-02)

  • Add Serializer.factory for creating a factory function that returns a Serializer instance.

  • MarshallingError stores its underlying exception as an instance variable. This is useful for inspecting errors.

  • fields.Select is aliased to fields.Enum.

  • Add fields.__all__ and marshmallow.__all__ so that the modules can be more easily extended.

  • Expose Serializer.OPTIONS_CLASS as a class variable so that options defaults can be overridden.

  • Add Serializer.process_data hook that allows subclasses to manipulate the final output data.

0.5.4 (2014-04-17)

  • Add json_module class Meta option.

  • Add required option to fields . Thanks @DeaconDesperado.

  • Tested on Python 3.4 and PyPy.

0.5.3 (2014-03-02)

  • Fix Integer field default. It is now 0 instead of 0.0. Thanks @kalasjocke.

  • Add context param to Serializer. Allows accessing arbitrary objects in Function and Method fields.

  • Function and Method fields raise MarshallingError if their argument is uncallable.

0.5.2 (2014-02-10)

  • Enable custom field validation via the validate parameter.

  • Add utils.from_rfc for parsing RFC datestring to Python datetime object.

0.5.1 (2014-02-02)

  • Avoid unnecessary attribute access in utils.to_marshallable_type for improved performance.

  • Fix RFC822 formatting for localized datetimes.

0.5.0 (2013-12-29)

  • Can customize validation error messages by passing the error parameter to a field.

  • Backwards-incompatible: Rename fields.NumberField -> fields.Number.

  • Add fields.Select. Thanks @ecarreras.

  • Support nesting a Serializer within itself by passing "self" into fields.Nested (only up to depth=1).

  • Backwards-incompatible: No implicit serializing of collections. Must set many=True if serializing to a list. This ensures that marshmallow handles singular objects correctly, even if they are iterable.

  • If Nested field only parameter is a field name, only return a single value for the nested object (instead of a dict) or a flat list of values.

  • Improved performance and stability.

0.4.1 (2013-12-01)

  • An object’s __marshallable__ method, if defined, takes precedence over __getitem__.

  • Generator expressions can be passed to a serializer.

  • Better support for serializing list-like collections (e.g. ORM querysets).

  • Other minor bugfixes.

0.4.0 (2013-11-24)

  • Add additional class Meta option.

  • Add dateformat class Meta option.

  • Support for serializing UUID, date, time, and timedelta objects.

  • Remove Serializer.to_data method. Just use property.

  • String field defaults to empty string instead of None.

  • Backwards-incompatible: isoformat and rfcformat functions moved to

  • Backwards-incompatible: Validation functions moved to

  • Backwards-incompatible: Remove

  • Reorder parameters to DateTime field (first parameter is dateformat).

  • Ensure that to_json returns bytestrings.

  • Fix bug with including an object property in fields Meta option.

  • Fix bug with passing None to a serializer.

0.3.1 (2013-11-16)

  • Fix bug with serializing dictionaries.

  • Fix error raised when serializing empty list.

  • Add only and exclude parameters to Serializer constructor.

  • Add strict parameter and option: causes Serializer to raise an error if invalid data are passed in, rather than storing errors.

  • Updated Flask + SQLA example in docs.

0.3.0 (2013-11-14)

  • Declaring Serializers just got easier. The class Meta paradigm allows you to specify fields more concisely. Can specify fields and exclude options.

  • Allow date formats to be changed by passing format parameter to DateTime field constructor. Can either be "rfc" (default), "iso", or a date format string.

  • More useful error message when declaring fields as classes (instead of an instance, which is the correct usage).

  • Rename MarshallingException -> MarshallingError.

  • Rename marshmallow.core -> marshmallow.serializer.

0.2.1 (2013-11-12)

  • Allow prefixing field names.

  • Fix storing errors on Nested Serializers.

  • Python 2.6 support.

0.2.0 (2013-11-11)

  • Field-level validation.

  • Add fields.Method.

  • Add fields.Function.

  • Allow binding of extra data to a serialized object by passing the extra param when initializing a Serializer.

  • Add relative parameter to fields.Url that allows for relative URLs.

0.1.0 (2013-11-10)

  • First release.