diff --git a/ormar/models/metaclass.py b/ormar/models/metaclass.py index 208e0eb9a..36a3e7488 100644 --- a/ormar/models/metaclass.py +++ b/ormar/models/metaclass.py @@ -238,7 +238,7 @@ def update_attrs_from_base_meta( # noqa: CCR001 :type model_fields: Dict[str, BaseField] """ - params_to_update = ["metadata", "database", "constraints"] + params_to_update = ["metadata", "database", "constraints", "property_fields"] for param in params_to_update: current_value = attrs.get("Meta", {}).__dict__.get(param, ormar.Undefined) parent_value = ( diff --git a/tests/test_inheritance_and_pydantic_generation/test_inheritance_of_property_fields.py b/tests/test_inheritance_and_pydantic_generation/test_inheritance_of_property_fields.py new file mode 100644 index 000000000..9e9169f7c --- /dev/null +++ b/tests/test_inheritance_and_pydantic_generation/test_inheritance_of_property_fields.py @@ -0,0 +1,69 @@ +import databases +import pytest +import sqlalchemy +import sqlalchemy as sa + +import ormar +from tests.settings import DATABASE_URL + +metadata = sa.MetaData() +database = databases.Database(DATABASE_URL) + + +class BaseFoo(ormar.Model): + class Meta: + abstract = True + + name: str = ormar.String(max_length=100) + + @ormar.property_field + def prefixed_name(self) -> str: + return "prefix_" + self.name + + +class Foo(BaseFoo): + class Meta: + metadata = metadata + database = database + + @ormar.property_field + def double_prefixed_name(self) -> str: + return "prefix2_" + self.name + + id: int = ormar.Integer(primary_key=True) + + +class Bar(BaseFoo): + class Meta: + metadata = metadata + database = database + + @ormar.property_field + def prefixed_name(self) -> str: + return "baz_" + self.name + + id: int = ormar.Integer(primary_key=True) + + +@pytest.fixture(autouse=True, scope="module") +def create_test_database(): + engine = sqlalchemy.create_engine(DATABASE_URL) + metadata.drop_all(engine) + metadata.create_all(engine) + yield + metadata.drop_all(engine) + + +def test_property_fields_are_inherited(): + foo = Foo(name="foo") + assert foo.prefixed_name == "prefix_foo" + assert foo.dict() == { + "name": "foo", + "id": None, + "double_prefixed_name": "prefix2_foo", + "prefixed_name": "prefix_foo", + } + + bar = Bar(name="bar") + assert bar.prefixed_name == "baz_bar" + assert bar.dict() == {"name": "bar", "id": None, "prefixed_name": "baz_bar"}