pythonasyncioapiasyncfastapiframeworkjsonjson-schemaopenapiopenapi3pydanticpython-typespython3redocreststarletteswaggerswagger-uiuvicornweb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.3 KiB
51 lines
1.3 KiB
from fastapi.encoders import jsonable_encoder
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class SubModel(BaseModel):
|
|
name: str
|
|
value: int = 42
|
|
|
|
|
|
class MainModel(BaseModel):
|
|
id: int
|
|
title: str
|
|
sub: SubModel
|
|
items: list[SubModel]
|
|
maybe: str | None = None
|
|
_sa_instance_state: str = "should-be-removed"
|
|
|
|
|
|
def test_basemodel_serialization_correctness():
|
|
sub = SubModel(name="test")
|
|
model = MainModel(
|
|
id=1,
|
|
title="hello",
|
|
sub=sub,
|
|
items=[sub, SubModel(name="another", value=10)],
|
|
)
|
|
|
|
# 1. Standard serialization
|
|
encoded = jsonable_encoder(model)
|
|
assert encoded == {
|
|
"id": 1,
|
|
"title": "hello",
|
|
"sub": {"name": "test", "value": 42},
|
|
"items": [
|
|
{"name": "test", "value": 42},
|
|
{"name": "another", "value": 10},
|
|
],
|
|
"maybe": None,
|
|
}
|
|
|
|
# 2. Exclude none
|
|
encoded_exclude_none = jsonable_encoder(model, exclude_none=True)
|
|
assert "maybe" not in encoded_exclude_none
|
|
|
|
# 3. Include and Exclude parameter filtering
|
|
encoded_filtered = jsonable_encoder(model, include={"id", "title"})
|
|
assert encoded_filtered == {"id": 1, "title": "hello"}
|
|
|
|
encoded_excluded = jsonable_encoder(model, exclude={"sub", "items"})
|
|
assert "sub" not in encoded_excluded
|
|
assert "items" not in encoded_excluded
|
|
|