From f7f7b053eeb57b79c89bff42c77434f411c5c6ec Mon Sep 17 00:00:00 2001 From: nightcityblade Date: Sun, 23 Aug 2026 11:29:08 +0800 Subject: [PATCH] Reflect field load-only and dump-only flags on schema --- src/marshmallow/schema.py | 12 ++++++++++-- tests/test_schema.py | 11 +++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/marshmallow/schema.py b/src/marshmallow/schema.py index 8024dfe13..24f0ae9ff 100644 --- a/src/marshmallow/schema.py +++ b/src/marshmallow/schema.py @@ -428,8 +428,16 @@ def __init__( self.exclude: set[typing.Any] | typing.MutableSet[typing.Any] = set( self.opts.exclude ) | set(exclude) - self.load_only = set(load_only) or set(self.opts.load_only) - self.dump_only = set(dump_only) or set(self.opts.dump_only) + self.load_only = (set(load_only) or set(self.opts.load_only)) | { + name + for name, field_obj in self.declared_fields.items() + if field_obj.load_only + } + self.dump_only = (set(dump_only) or set(self.opts.dump_only)) | { + name + for name, field_obj in self.declared_fields.items() + if field_obj.dump_only + } self.partial = partial self.unknown: types.UnknownOption = ( self.opts.unknown if unknown is None else unknown diff --git a/tests/test_schema.py b/tests/test_schema.py index ff2811737..befad2b11 100644 --- a/tests/test_schema.py +++ b/tests/test_schema.py @@ -1297,6 +1297,17 @@ class MySchema(Schema): MySchema() +def test_load_only_and_dump_only_include_declared_field_options(): + class MySchema(Schema): + read_only = fields.String(dump_only=True) + write_only = fields.String(load_only=True) + + schema = MySchema() + + assert schema.dump_only == {"read_only"} + assert schema.load_only == {"write_only"} + + class TestDeeplyNestedLoadOnly: @pytest.fixture def schema(self):