Skip to content

Commit fcbd8a3

Browse files
Fix pydict serialization for optional fields (#495)
1 parent aad7d2a commit fcbd8a3

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

src/betterproto/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,6 +1373,9 @@ def to_pydict(
13731373
value = [i.to_pydict(casing, include_default_values) for i in value]
13741374
if value or include_default_values:
13751375
output[cased_name] = value
1376+
elif value is None:
1377+
if include_default_values:
1378+
output[cased_name] = None
13761379
elif (
13771380
value._serialized_on_wire
13781381
or include_default_values

tests/test_features.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,32 @@ class Request(betterproto.Message):
265265
assert Request().parse(b"\n\x00").flag is False
266266

267267

268+
def test_optional_datetime_to_dict():
269+
@dataclass
270+
class Request(betterproto.Message):
271+
date: Optional[datetime] = betterproto.message_field(1, optional=True)
272+
273+
# Check dict serialization
274+
assert Request().to_dict() == {}
275+
assert Request().to_dict(include_default_values=True) == {"date": None}
276+
assert Request(date=datetime(2020, 1, 1)).to_dict() == {
277+
"date": "2020-01-01T00:00:00Z"
278+
}
279+
assert Request(date=datetime(2020, 1, 1)).to_dict(include_default_values=True) == {
280+
"date": "2020-01-01T00:00:00Z"
281+
}
282+
283+
# Check pydict serialization
284+
assert Request().to_pydict() == {}
285+
assert Request().to_pydict(include_default_values=True) == {"date": None}
286+
assert Request(date=datetime(2020, 1, 1)).to_pydict() == {
287+
"date": datetime(2020, 1, 1)
288+
}
289+
assert Request(date=datetime(2020, 1, 1)).to_pydict(
290+
include_default_values=True
291+
) == {"date": datetime(2020, 1, 1)}
292+
293+
268294
def test_to_json_default_values():
269295
@dataclass
270296
class TestMessage(betterproto.Message):

0 commit comments

Comments
 (0)