diff --git a/ormar/models/mixins/save_mixin.py b/ormar/models/mixins/save_mixin.py index de3923e..1900a65 100644 --- a/ormar/models/mixins/save_mixin.py +++ b/ormar/models/mixins/save_mixin.py @@ -164,7 +164,10 @@ class SavePrepareMixin(RelationMixin, AliasMixin): ): new_kwargs[field_name] = field.get_default() # clear fields with server_default set as None - if field.server_default is not None and not new_kwargs.get(field_name): + if ( + field.server_default is not None + and new_kwargs.get(field_name, None) is None + ): new_kwargs.pop(field_name, None) return new_kwargs diff --git a/tests/test_model_methods/test_populate_default_values.py b/tests/test_model_methods/test_populate_default_values.py new file mode 100644 index 0000000..b3cd2b6 --- /dev/null +++ b/tests/test_model_methods/test_populate_default_values.py @@ -0,0 +1,41 @@ +import databases +import pytest +import sqlalchemy +from sqlalchemy import text + +import ormar +from tests.settings import DATABASE_URL + +database = databases.Database(DATABASE_URL, force_rollback=True) +metadata = sqlalchemy.MetaData() + + +class BaseMeta(ormar.ModelMeta): + database = database + metadata = metadata + + +class Task(ormar.Model): + class Meta(BaseMeta): + tablename = "tasks" + + id: int = ormar.Integer(primary_key=True) + name: str = ormar.String( + max_length=255, minimum=0, server_default=text("Default Name"), nullable=False + ) + points: int = ormar.Integer( + default=0, minimum=0, server_default=text("0"), nullable=False + ) + + +def test_populate_default_values(): + new_kwargs = { + "id": None, + "name": "", + "points": 0, + } + result = Task.populate_default_values(new_kwargs) + + assert result["id"] is None + assert result["name"] == "" + assert result["points"] == 0