diff --git a/beanie/odm/utils/init.py b/beanie/odm/utils/init.py index 18aa6dd3..54c2b802 100644 --- a/beanie/odm/utils/init.py +++ b/beanie/odm/utils/init.py @@ -175,9 +175,15 @@ def init_settings( :return: None """ settings_class = getattr(cls, "Settings", None) - settings_vars = ( - {} if settings_class is None else dict(vars(settings_class)) - ) + settings_vars = {} + if settings_class is not None: + # get all attributes of the Settings subclass (including inherited ones) + # without magic dunder methods + settings_vars = { + attr: getattr(settings_class, attr) + for attr in dir(settings_class) + if not attr.startswith("__") + } if issubclass(cls, Document): cls._document_settings = parse_model( DocumentSettings, settings_vars diff --git a/tests/odm/documents/test_init.py b/tests/odm/documents/test_init.py index b8d30d15..b87a62fd 100644 --- a/tests/odm/documents/test_init.py +++ b/tests/odm/documents/test_init.py @@ -360,3 +360,22 @@ async def test_init_document_with_union_type_expression_optional_back_link(db): "back_link", } ) + + +async def test_init_document_can_inhert_and_extend_settings(db): + class Sample1(Document): + class Settings: + name = "sample1" + bson_encoders = {Color: lambda x: x.value} + + class Sample2(Sample1): + class Settings(Sample1.Settings): + name = "sample2" + + await init_beanie( + database=db, + document_models=[Sample2], + ) + + assert Sample2.get_settings().bson_encoders != {} + assert Sample2.get_settings().name == "sample2"