✨ Add support in jsonable_encoder for include and exclude with dataclasses (#4923)

Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
This commit is contained in:
DCsunsetandSebastián Ramírez authored and GitHub committed 2022-09-08 16:29:23 +02:00
1 parent 895789bed0
commit 3ec498af63
2 files changed
+21 -1

No files matched your search

+5 -1
View File
@@ -74,8 +74,12 @@ def jsonable_encoder(
obj_dict = dataclasses.asdict(obj)
return jsonable_encoder(
obj_dict,
exclude_none=exclude_none,
include=include,
exclude=exclude,
by_alias=by_alias,
exclude_unset=exclude_unset,
exclude_defaults=exclude_defaults,
exclude_none=exclude_none,
custom_encoder=custom_encoder,
sqlalchemy_safe=sqlalchemy_safe,
)
+16
View File
@@ -1,3 +1,4 @@
from dataclasses import dataclass
from datetime import datetime, timezone
from enum import Enum
from pathlib import PurePath, PurePosixPath, PureWindowsPath
@@ -19,6 +20,12 @@ class Pet:
self.name = name
@dataclass
class Item:
name: str
count: int
class DictablePerson(Person):
def __iter__(self):
return ((k, v) for k, v in self.__dict__.items())
@@ -131,6 +138,15 @@ def test_encode_dictable():
}
def test_encode_dataclass():
item = Item(name="foo", count=100)
assert jsonable_encoder(item) == {"name": "foo", "count": 100}
assert jsonable_encoder(item, include={"name"}) == {"name": "foo"}
assert jsonable_encoder(item, exclude={"count"}) == {"name": "foo"}
assert jsonable_encoder(item, include={}) == {}
assert jsonable_encoder(item, exclude={}) == {"name": "foo", "count": 100}
def test_encode_unsupported():
unserializable = Unserializable()
with pytest.raises(ValueError):