Skip to content
35 changes: 21 additions & 14 deletions ninja/operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,26 +275,33 @@ def _result_to_response(
# Empty response.
return temporal_response

resp_object = ResponseObject(result)
# ^ we need object because getter_dict seems work only with model_validate
validated_object = response_model.model_validate(
resp_object, context={"request": request, "response_status": status}
)

model_dump_kwargs: Dict[str, Any] = {}
model_dump_kwargs: Dict[str, Any] = {
"by_alias": self.by_alias,
"exclude_unset": self.exclude_unset,
"exclude_defaults": self.exclude_defaults,
"exclude_none": self.exclude_none,
}
if pydantic_version >= [2, 7]:
# pydantic added support for serialization context at 2.7
model_dump_kwargs.update(
context={"request": request, "response_status": status}
)

result = validated_object.model_dump(
by_alias=self.by_alias,
exclude_unset=self.exclude_unset,
exclude_defaults=self.exclude_defaults,
exclude_none=self.exclude_none,
**model_dump_kwargs,
)["response"]
if isinstance(result, pydantic.BaseModel):
# if the result is already a Schema, just return it
return self.api.create_response(
request,
result.model_dump(**model_dump_kwargs),
temporal_response=temporal_response,
)

resp_object = ResponseObject(result)
# ^ we need object because getter_dict seems work only with model_validate
validated_object = response_model.model_validate(
resp_object, context={"request": request, "response_status": status}
)

result = validated_object.model_dump(**model_dump_kwargs)["response"]
return self.api.create_response(
request, result, temporal_response=temporal_response
)
Expand Down
10 changes: 10 additions & 0 deletions tests/test_response_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ def op_exclude_none(request):
return {"field1": None, "field2": "default value"}


@api.get("/test-schema-return", response=SomeResponse)
def op_return_schema(request):
return SomeResponse()


client = TestClient(api)


Expand All @@ -46,3 +51,8 @@ def test_arguments():
assert client.get("/test-unset").json() == {"field3": 10}
assert client.get("/test-defaults").json() == {"field1": 3}
assert client.get("/test-none").json() == {"field2": "default value"}
assert client.get("/test-schema-return").json() == {
"field1": 1,
"field2": "default value",
"field3": None,
}