]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
⚡️ Fix `default_factory` for response model field with Pydantic V1 (#9704)
authorvvanglro <947001731@qq.com>
Sat, 20 Sep 2025 18:51:40 +0000 (02:51 +0800)
committerGitHub <noreply@github.com>
Sat, 20 Sep 2025 18:51:40 +0000 (20:51 +0200)
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
fastapi/utils.py
tests/test_response_model_default_factory.py [new file with mode: 0644]

index 4c7350fea9e5e59091a765ef3d2b979c688b07a8..98725ff196bf0dc409214a536c214e56fbddf7bc 100644 (file)
@@ -137,6 +137,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[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
diff --git a/tests/test_response_model_default_factory.py b/tests/test_response_model_default_factory.py
new file mode 100644 (file)
index 0000000..13c1f44
--- /dev/null
@@ -0,0 +1,47 @@
+from fastapi import FastAPI
+from fastapi.testclient import TestClient
+from pydantic import BaseModel, Field
+
+app = FastAPI()
+
+
+class ResponseModel(BaseModel):
+    code: int = 200
+    message: str = Field(default_factory=lambda: "Successful operation.")
+
+
+@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"] == "Successful operation."
+
+
+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"] == "Successful operation."