Source code for flask_resty.fields

import marshmallow.utils
from marshmallow import fields

# -----------------------------------------------------------------------------


[docs]class RelatedItem(fields.Nested): """A nested object field that only requires the ID on load. This class is a wrapper around :py:class:`marshmallow.fields.Nested` that provides simplified semantics in the context of a normalized REST API. When dumping, this field will dump the nested object as normal. When loading, this field will do a partial load to retrieve just the ID. This is because, when interacting with a resource that has a relationship to existing instances of another resource, the ID is sufficient to uniquely identify instances of the other resource. """ def _deserialize(self, value, *args, **kwargs): if self.many and not marshmallow.utils.is_collection(value): raise self.make_error( "type", input=value, type=value.__class__.__name__ ) # Do partial load of related item, as we only need the id. return self.schema.load(value, partial=True) def _validate_missing(self, value): # Do not display detailed error data on required fields in nested # schema - in this context, they're actually not required. super(fields.Nested, self)._validate_missing(value)
[docs]class DelimitedList(fields.List): """List represented as a comma-delimited string, for use with args_schema. Same as `marshmallow.fields.List`, except can load from either a list or a delimited string (e.g. "foo,bar,baz"). Directly taken from webargs: https://github.com/marshmallow-code/webargs/blob/de061e037285fd08a42d73be95bc779f2a4e3c47/src/webargs/fields.py#L47 :param Field cls_or_instance: A field class or instance. :param str delimiter: Delimiter between values. :param bool as_string: Dump values to string. """ delimiter = "," def __init__( self, cls_or_instance, delimiter=None, as_string=False, **kwargs ): super().__init__(cls_or_instance, **kwargs) self.delimiter = delimiter or self.delimiter self.as_string = as_string def _serialize(self, value, attr, obj): ret = super()._serialize(value, attr, obj) if self.as_string: return self.delimiter.join(format(each) for each in ret) return ret def _deserialize(self, value, attr, data, **kwargs): try: ret = ( value if marshmallow.utils.is_iterable_but_not_string(value) else value.split(self.delimiter) ) except AttributeError as error: raise self.make_error("invalid") from error return super()._deserialize(ret, attr, data, **kwargs)