From 5ffc1c05a9290822352529b14ce9e70c15059825 Mon Sep 17 00:00:00 2001 From: vvanglro <947001731@qq.com> Date: Tue, 20 Jun 2023 11:37:11 +0800 Subject: [PATCH 1/2] fix: return dict response model default factory is not work --- fastapi/utils.py | 1 + tests/test_response_model_default_factory.py | 52 ++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 tests/test_response_model_default_factory.py diff --git a/fastapi/utils.py b/fastapi/utils.py index 9b9ebcb85..5b1e60ca1 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -140,6 +140,7 @@ def create_cloned_field( new_field.alias = field.alias new_field.class_validators = field.class_validators new_field.default = field.default + new_field.default_factory = field.default_factory new_field.required = field.required new_field.model_config = field.model_config new_field.field_info = field.field_info diff --git a/tests/test_response_model_default_factory.py b/tests/test_response_model_default_factory.py new file mode 100644 index 000000000..857502d9b --- /dev/null +++ b/tests/test_response_model_default_factory.py @@ -0,0 +1,52 @@ +import functools +import random + +from fastapi import FastAPI +from fastapi.testclient import TestClient +from pydantic import BaseModel, Field + +app = FastAPI() + +messages = ["操作成功.", "Successful operation."] + + +class ResponseModel(BaseModel): + code: int = 200 + message: str = Field(default_factory=functools.partial(random.choice, messages)) + + +@app.get( + "/response_model_has_default_factory_return_dict", + response_model=ResponseModel, +) +async def response_model_has_default_factory_return_dict(): + return {"code": 200} + + +@app.get( + "/response_model_has_default_factory_return_model", + response_model=ResponseModel, +) +async def response_model_has_default_factory_return_model(): + return ResponseModel() + + +client = TestClient(app) + + +def test_response_model_has_default_factory_return_dict(): + response = client.get("/response_model_has_default_factory_return_dict") + + assert response.status_code == 200, response.text + + assert response.json()["code"] == 200 + assert response.json()["message"] in messages + + +def test_response_model_has_default_factory_return_model(): + response = client.get("/response_model_has_default_factory_return_model") + + assert response.status_code == 200, response.text + + assert response.json()["code"] == 200 + assert response.json()["message"] in messages From ec72d15829cd24406e235c9f39c94cbb61d2af61 Mon Sep 17 00:00:00 2001 From: vvanglro Date: Thu, 13 Jun 2024 23:14:20 +0800 Subject: [PATCH 2/2] Update utils.py --- fastapi/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastapi/utils.py b/fastapi/utils.py index 10072a060..e3e781a15 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -140,7 +140,7 @@ def create_cloned_field( new_field.alias = field.alias # type: ignore[misc] new_field.class_validators = field.class_validators # type: ignore[attr-defined] new_field.default = field.default # type: ignore[misc] - new_field.default_factory = field.default_factory # type: ignore[misc] + new_field.default_factory = field.default_factory # type: ignore[attr-defined] new_field.required = field.required # type: ignore[misc] new_field.model_config = field.model_config # type: ignore[attr-defined] new_field.field_info = field.field_info