Skip to content

Commit 78cbc09

Browse files
authored
Merge pull request #2271 from deckar01/2270-meta-many
Many Option
2 parents 7609530 + c8ce7e8 commit 78cbc09

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

src/marshmallow/schema.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ def __init__(self, meta, ordered: bool = False):
228228
self.dump_only = getattr(meta, "dump_only", ())
229229
self.unknown = validate_unknown_parameter_value(getattr(meta, "unknown", RAISE))
230230
self.register = getattr(meta, "register", True)
231+
self.many = getattr(meta, "many", False)
231232

232233

233234
class Schema(base.SchemaABC, metaclass=SchemaMeta):
@@ -344,6 +345,7 @@ class Meta:
344345
`OrderedDict`.
345346
- ``exclude``: Tuple or list of fields to exclude in the serialized result.
346347
Nested fields can be represented with dot delimiters.
348+
- ``many``: Whether the data is a collection by default.
347349
- ``dateformat``: Default format for `Date <fields.Date>` fields.
348350
- ``datetimeformat``: Default format for `DateTime <fields.DateTime>` fields.
349351
- ``timeformat``: Default format for `Time <fields.Time>` fields.
@@ -367,7 +369,7 @@ def __init__(
367369
*,
368370
only: types.StrSequenceOrSet | None = None,
369371
exclude: types.StrSequenceOrSet = (),
370-
many: bool = False,
372+
many: bool | None = None,
371373
context: dict | None = None,
372374
load_only: types.StrSequenceOrSet = (),
373375
dump_only: types.StrSequenceOrSet = (),
@@ -381,7 +383,7 @@ def __init__(
381383
raise StringNotCollectionError('"exclude" should be a list of strings')
382384
# copy declared fields from metaclass
383385
self.declared_fields = copy.deepcopy(self._declared_fields)
384-
self.many = many
386+
self.many = self.opts.many if many is None else many
385387
self.only = only
386388
self.exclude: set[typing.Any] | typing.MutableSet[typing.Any] = set(
387389
self.opts.exclude

tests/test_options.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,3 +262,19 @@ class AddFieldsChild(self.AddFieldsSchema):
262262
assert "email" in s._declared_fields.keys()
263263
assert "from" in s._declared_fields.keys()
264264
assert isinstance(s._declared_fields["from"], fields.Str)
265+
266+
267+
class TestManyOption:
268+
class ManySchema(Schema):
269+
foo = fields.Str()
270+
271+
class Meta:
272+
many = True
273+
274+
def test_many_by_default(self):
275+
test = self.ManySchema()
276+
assert test.load([{"foo": "bar"}]) == [{"foo": "bar"}]
277+
278+
def test_explicit_single(self):
279+
test = self.ManySchema(many=False)
280+
assert test.load({"foo": "bar"}) == {"foo": "bar"}

0 commit comments

Comments
 (0)