diff --git a/kui/pydantic_compatible.py b/kui/pydantic_compatible.py index c7857db09..d3eb03c79 100644 --- a/kui/pydantic_compatible.py +++ b/kui/pydantic_compatible.py @@ -30,7 +30,7 @@ def validate_model(model: Type[BaseModel], v: Any) -> Tuple[Type[BaseModel], Any if hasattr(res, "__root__"): return model, res.__root__ else: - return model, res.dict(by_alias=False) + return model, res.__dict__ def get_model_fields(model: Type[BaseModel]) -> Dict[str, ModelField]: # type: ignore return model.__fields__ # type: ignore @@ -53,7 +53,7 @@ def validate_model(model: Type[BaseModel], v: Any) -> Tuple[Type[BaseModel], Any if isinstance(res, RootModel): return model, res.root else: - return model, res.model_dump(by_alias=False) + return model, res.__dict__ def get_model_fields(model: Type[BaseModel]) -> Dict[str, FieldInfo]: # type: ignore return model.model_fields diff --git a/tests/asgi/test_parameters.py b/tests/asgi/test_parameters.py index 878dc50e5..36b036d02 100644 --- a/tests/asgi/test_parameters.py +++ b/tests/asgi/test_parameters.py @@ -4,6 +4,7 @@ import httpx import pytest from async_asgi_testclient import TestClient +from pydantic import BaseModel from typing_extensions import Annotated from kui.asgi import ( @@ -255,3 +256,24 @@ async def upload_file(file: Annotated[UploadFile, Body(...)]): resp = await client.post("/", files={"file0": io.BytesIO(b"123")}) assert resp.status_code == 422 + + +@pytest.mark.asyncio +async def test_parameters_nest_model(): + app = Kui() + + class User(BaseModel): + name: str + age: int + + @app.router.http.post("/") + async def create_user(user: Annotated[User, Body(...)]): + assert user.age >= 18 + return user + + async with httpx.AsyncClient(app=app, base_url="http://testserver") as client: + resp = await client.post("/", json={"user": {"name": "aber", "age": 18}}) + assert resp.json() == {"name": "aber", "age": 18} + + resp = await client.post("/", json={"name": "aber", "age": 18}) + assert resp.status_code == 422 diff --git a/tests/wsgi/test_parameters.py b/tests/wsgi/test_parameters.py index 9c3043e21..f38824cbb 100644 --- a/tests/wsgi/test_parameters.py +++ b/tests/wsgi/test_parameters.py @@ -3,6 +3,7 @@ import httpx from httpx import Client +from pydantic import BaseModel from typing_extensions import Annotated from kui.wsgi import ( @@ -245,3 +246,23 @@ def upload_file(file: Annotated[UploadFile, Body(...)]): resp = client.post("/", files={"file0": io.BytesIO(b"123")}) assert resp.status_code == 422 + + +def test_parameters_nest_model(): + app = Kui() + + class User(BaseModel): + name: str + age: int + + @app.router.http.post("/") + def create_user(user: Annotated[User, Body(...)]): + assert user.age >= 18 + return user + + with httpx.Client(app=app, base_url="http://testserver") as client: + resp = client.post("/", json={"user": {"name": "aber", "age": 18}}) + assert resp.json() == {"name": "aber", "age": 18} + + resp = client.post("/", json={"name": "aber", "age": 18}) + assert resp.status_code == 422