Skip to content

Commit f8b64e2

Browse files
committed
can provide a JSON default as a dict or list
1 parent 81b8868 commit f8b64e2

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

piccolo/columns/column_types.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,8 +1054,22 @@ class JSON(Column):
10541054

10551055
value_type = str
10561056

1057-
def __init__(self, default: t.Union[str, None] = "{}", **kwargs) -> None:
1058-
self._validate_default(default, (str, None))
1057+
def __init__(
1058+
self, default: t.Union[str, t.List, t.Dict, None] = "{}", **kwargs
1059+
) -> None:
1060+
self._validate_default(default, (str, list, dict, None))
1061+
1062+
if isinstance(default, (list, dict)):
1063+
# TODO - move to utils
1064+
try:
1065+
import orjson
1066+
except ImportError:
1067+
import json
1068+
1069+
default = json.dumps(default, default=str)
1070+
else:
1071+
default = orjson.dumps(default, default=str).decode("utf8")
1072+
10591073
self.default = default
10601074
kwargs.update({"default": default})
10611075
super().__init__(**kwargs)

tests/columns/test_json.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,15 @@ class MyTable(Table):
99

1010

1111
class MyTableDefault(Table):
12-
json = JSON(default="{}")
12+
"""
13+
Test the different default types.
14+
"""
15+
16+
json = JSON()
17+
json_str = JSON(default="{}")
18+
json_dict = JSON(default={})
19+
json_list = JSON(default=[])
20+
json_none = JSON(default=None, null=True)
1321

1422

1523
class TestJSON(TestCase):
@@ -24,7 +32,25 @@ def test_json(self):
2432
row.save().run_sync()
2533
self.assertEqual(row.json, '{"a": 1}')
2634

35+
36+
class TestJSONDefault(TestCase):
37+
def setUp(self):
38+
MyTableDefault.create_table().run_sync()
39+
40+
def tearDown(self):
41+
MyTableDefault.alter().drop_table().run_sync()
42+
2743
def test_json_default(self):
28-
row = MyTable()
44+
row = MyTableDefault()
2945
row.save().run_sync()
46+
3047
self.assertEqual(row.json, "{}")
48+
self.assertEqual(row.json_str, "{}")
49+
self.assertEqual(row.json_dict, "{}")
50+
self.assertEqual(row.json_list, "[]")
51+
self.assertEqual(row.json_none, None)
52+
53+
def test_invalid_default(self):
54+
with self.assertRaises(ValueError):
55+
for value in ("a", 1, ("x", "y", "z")):
56+
JSON(default=value)

0 commit comments

Comments
 (0)