Skip to content

Commit 196dea7

Browse files
committed
fix: diff된 모델 및 jsonized된 모델의 json.dumps가 실패하던 문제 수정
1 parent 683afed commit 196dea7

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

app/core/util/django_orm.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,14 @@
1111
from django.db import models
1212
from django.db.models.fields.files import FieldFile
1313
from django.forms import model_to_dict
14+
from django.utils.functional import Promise
1415

1516

1617
def arbitrary_value_to_basic_type(value: typing.Any) -> str | int | float | bool | None:
1718
"""Convert an arbitrary value to a basic type that can be JSON serialized."""
18-
if isinstance(value, (int, float, bool)):
19+
if isinstance(value, Promise):
20+
return str(value)
21+
elif isinstance(value, (int, float, bool)):
1922
return value
2023
elif isinstance(value, str):
2124
return value
@@ -62,17 +65,21 @@ def _model_to_jsonable_dict( # noqa: C901
6265
jsonable_model_dict: dict[str, str | int | float | bool | None] = {
6366
"id": str(instance.pk) if isinstance(instance.pk, uuid.UUID) else instance.pk,
6467
"pk": str(instance.pk) if isinstance(instance.pk, uuid.UUID) else instance.pk,
65-
"_meta": types.SimpleNamespace(
66-
app_label=instance._meta.app_label,
67-
model_name=instance._meta.model_name,
68-
verbose_name=instance._meta.verbose_name,
69-
verbose_name_plural=instance._meta.verbose_name_plural,
70-
),
68+
"_meta": {
69+
"app_label": instance._meta.app_label,
70+
"model_name": str(instance._meta.model_name),
71+
"verbose_name": str(instance._meta.verbose_name),
72+
"verbose_name_plural": str(instance._meta.verbose_name_plural),
73+
},
7174
}
7275

7376
for field, value in model_dict.items():
7477
if isinstance(value, (datetime.datetime, datetime.date, datetime.time)):
7578
jsonable_model_dict[field] = value.isoformat()
79+
elif isinstance(value, Promise):
80+
# Django's translation system returns a Promise object for translated strings.
81+
# We can safely convert it to a string.
82+
jsonable_model_dict[field] = str(value)
7683
elif isinstance(value, (uuid.UUID, int, str)):
7784
# Is this field just a UUID | int | str, or is it a ForeignKey/OneToOneField?
7885
# django.forms.model_to_dict will return a UUID for Proxy model fields,
@@ -197,6 +204,9 @@ def apply_diff_to_jsonized_models(
197204
)
198205

199206
for field_name, new_value in diff_data.items():
207+
if field_name.startswith("_"):
208+
# Skip private fields
209+
continue
200210
updated_models[model_identifier][field_name] = new_value
201211

202212
return updated_models

0 commit comments

Comments
 (0)