Skip to content

Commit 0d1712d

Browse files
committed
tests for extra filtering
1 parent 38630f6 commit 0d1712d

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

src/serializers/fields.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ impl TypeSerializer for GeneralFieldsSerializer {
210210
// this is used to include `__pydantic_extra__` in serialization on models
211211
if let Some(extra_dict) = extra_dict {
212212
for (key, value) in extra_dict.iter() {
213+
if extra.exclude_none && value.is_none() {
214+
continue;
215+
}
213216
if let Some((next_include, next_exclude)) = self.filter.key_filter(key, include, exclude)? {
214217
let value = infer_to_python(value, next_include, next_exclude, &td_extra)?;
215218
output_dict.set_item(key, value)?;
@@ -288,6 +291,9 @@ impl TypeSerializer for GeneralFieldsSerializer {
288291
// this is used to include `__pydantic_extra__` in serialization on models
289292
if let Some(extra_dict) = extra_dict {
290293
for (key, value) in extra_dict.iter() {
294+
if extra.exclude_none && value.is_none() {
295+
continue;
296+
}
291297
let filter = self.filter.key_filter(key, include, exclude).map_err(py_err_se_err)?;
292298
if let Some((next_include, next_exclude)) = filter {
293299
let output_key = infer_json_key(key, &td_extra).map_err(py_err_se_err)?;

tests/serializers/test_model.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,3 +778,27 @@ class MyModel:
778778
assert s.to_python(m) == {'field_a': b'test', 'field_b': 12, 'field_c': 'extra'}
779779
assert s.to_python(m, mode='json') == {'field_a': 'test', 'field_b': 12, 'field_c': 'extra'}
780780
assert s.to_json(m) == b'{"field_a":"test","field_b":12,"field_c":"extra"}'
781+
782+
# test filtering
783+
m = v.validate_python({'field_a': b'test', 'field_b': 12, 'field_c': None, 'field_d': [1, 2, 3]})
784+
assert isinstance(m, MyModel)
785+
assert m.__dict__ == {'field_a': b'test', 'field_b': 12}
786+
assert m.__pydantic_extra__ == {'field_c': None, 'field_d': [1, 2, 3]}
787+
assert m.__pydantic_fields_set__ == {'field_a', 'field_b', 'field_c', 'field_d'}
788+
789+
assert s.to_python(m) == {'field_a': b'test', 'field_b': 12, 'field_c': None, 'field_d': [1, 2, 3]}
790+
assert s.to_json(m) == b'{"field_a":"test","field_b":12,"field_c":null,"field_d":[1,2,3]}'
791+
792+
assert s.to_python(m, exclude_none=True) == {'field_a': b'test', 'field_b': 12, 'field_d': [1, 2, 3]}
793+
assert s.to_json(m, exclude_none=True) == b'{"field_a":"test","field_b":12,"field_d":[1,2,3]}'
794+
795+
assert s.to_python(m, exclude={'field_c'}) == {'field_a': b'test', 'field_b': 12, 'field_d': [1, 2, 3]}
796+
assert s.to_json(m, exclude={'field_c'}) == b'{"field_a":"test","field_b":12,"field_d":[1,2,3]}'
797+
798+
assert s.to_python(m, exclude={'field_d': [0]}) == {
799+
'field_a': b'test',
800+
'field_b': 12,
801+
'field_c': None,
802+
'field_d': [2, 3],
803+
}
804+
assert s.to_json(m, exclude={'field_d': [0]}) == b'{"field_a":"test","field_b":12,"field_c":null,"field_d":[2,3]}'

0 commit comments

Comments
 (0)