diff --git a/ormar/models/mixins/save_mixin.py b/ormar/models/mixins/save_mixin.py index 89ddbfe..c0868fb 100644 --- a/ormar/models/mixins/save_mixin.py +++ b/ormar/models/mixins/save_mixin.py @@ -23,6 +23,7 @@ import ormar # noqa: I100, I202 from ormar.exceptions import ModelPersistenceError from ormar.models.mixins import AliasMixin from ormar.models.mixins.relation_mixin import RelationMixin +from ormar.queryset.utils import to_str if TYPE_CHECKING: # pragma: no cover from ormar import ForeignKeyField, Model @@ -208,7 +209,7 @@ class SavePrepareMixin(RelationMixin, AliasMixin): """ for key, value in model_dict.items(): if key in cls._json_fields and not isinstance(value, str): - model_dict[key] = json.dumps(value) + model_dict[key] = to_str(json.dumps(value)) return model_dict @classmethod diff --git a/ormar/queryset/utils.py b/ormar/queryset/utils.py index 4ebe07c..1f5a5a3 100644 --- a/ormar/queryset/utils.py +++ b/ormar/queryset/utils.py @@ -17,6 +17,13 @@ if TYPE_CHECKING: # pragma no cover from ormar import Model, BaseField +def to_str(val: Union[bytes, str]): + """ convert bytes to str simply """ + if isinstance(val, bytes): + return val.decode() + return str(val) + + def check_node_not_dict_or_not_last_node( part: str, is_last: bool, current_level: Any ) -> bool: diff --git a/tests/test_queries/test_queryset_level_methods.py b/tests/test_queries/test_queryset_level_methods.py index 449c7df..52cced5 100644 --- a/tests/test_queries/test_queryset_level_methods.py +++ b/tests/test_queries/test_queryset_level_methods.py @@ -42,6 +42,7 @@ class ToDo(ormar.Model): id: int = ormar.Integer(primary_key=True) text: str = ormar.String(max_length=500) completed: bool = ormar.Boolean(default=False) + pairs: List[str] = ormar.JSON(default=[]) class Category(ormar.Model):