Skip to content

Commit f94b5e3

Browse files
committed
fixing exclude_none for json serialization of computed fields
1 parent c7daf16 commit f94b5e3

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

src/serializers/computed_fields.rs

+4
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ impl ComputedFields {
7373
}
7474
for computed_field in &self.0 {
7575
let property_name_py = computed_field.property_name_py.as_ref(model.py());
76+
let value = model.getattr(property_name_py).map_err(py_err_se_err)?;
77+
if extra.exclude_none && value.is_none() {
78+
return Ok(());
79+
}
7680
if let Some((next_include, next_exclude)) = filter
7781
.key_filter(property_name_py, include, exclude)
7882
.map_err(py_err_se_err)?

tests/serializers/test_model.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ def volume(self) -> int:
608608
assert s.to_json(Model(3, 4)) == b'{"width":3,"height":4,"Area":12,"volume":48}'
609609

610610

611-
def test_computed_field_to_python_exclude_none():
611+
def test_computed_field_exclude_none():
612612
@dataclasses.dataclass
613613
class Model:
614614
width: int
@@ -646,6 +646,8 @@ def volume(self) -> None:
646646
'volume': None,
647647
}
648648
assert s.to_python(Model(3, 4), mode='json', exclude_none=True) == {'width': 3, 'height': 4, 'Area': 12}
649+
assert s.to_json(Model(3, 4), exclude_none=False) == b'{"width":3,"height":4,"Area":12,"volume":null}'
650+
assert s.to_json(Model(3, 4), exclude_none=True) == b'{"width":3,"height":4,"Area":12}'
649651

650652

651653
@pytest.mark.skipif(cached_property is None, reason='cached_property is not available')

0 commit comments

Comments
 (0)