]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
✨ Add support in `jsonable_encoder` for include and exclude with dataclasses (#4923)
authorDCsunset <DCsunset@users.noreply.github.com>
Thu, 8 Sep 2022 14:29:23 +0000 (10:29 -0400)
committerGitHub <noreply@github.com>
Thu, 8 Sep 2022 14:29:23 +0000 (16:29 +0200)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
fastapi/encoders.py
tests/test_jsonable_encoder.py

index f64e4b86ea3b48aaf6de3fa1761c24f034f93ce1..93045ca27f1589c8b1632a30cfa094a7492a9782 100644 (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,
         )
index 5e55f2f918467f97bf066d61670872a24a4a9d13..f4fdcf6014a4377fc8cae84e35b7ba71d1454080 100644 (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):