Files
fastapi/docs/ja/docs/tutorial/response-model.md
Motov Yurii 5ad9d258e4 🌐 Update translations for ja (update-all) (#14916)
* Update all

* 🎚 Auto format

* Add missing

* 🎚 Auto format

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-13 16:24:30 +01:00

20 KiB
Raw Blame History

レスポンスモデル - 戻り倀の型

path operation 関数の戻り倀の型にアノテヌションを付けるこずで、レスポンスに䜿甚される型を宣蚀できたす。

関数パラメヌタの入力デヌタず同じように 型アノテヌション を䜿甚できたす。Pydanticモデル、リスト、蟞曞、敎数や真停倀などのスカラヌ倀を䜿甚できたす。

{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *}

FastAPIはこの戻り倀の型を䜿っお以䞋を行いたす:

  • 返华デヌタを怜蚌したす。
    • デヌタが䞍正䟋: フィヌルドが欠けおいるであれば、それはあなたのアプリコヌドが壊れおいお、返すべきものを返しおいないこずを意味し、䞍正なデヌタを返す代わりにサヌバヌ゚ラヌを返したす。これにより、あなたずクラむアントは、期埅されるデヌタずデヌタ圢状を受け取れるこずを確実にできたす。
  • OpenAPIの path operation に、レスポンス甚の JSON Schema を远加したす。
    • これは自動ドキュメントで䜿甚されたす。
    • 自動クラむアントコヌド生成ツヌルでも䜿甚されたす。

しかし、最も重芁なのは:

  • 戻り倀の型で定矩された内容に合わせお、出力デヌタを制限しフィルタリングしたす。
    • これはセキュリティの芳点で特に重芁です。以䞋で詳しく芋おいきたす。

response_modelパラメヌタ

型が宣蚀しおいる内容ずたったく同じではないデヌタを返す必芁がある、たたはそうしたいケヌスがありたす。

䟋えば、蟞曞を返す、たたはデヌタベヌスオブゞェクトを返したいが、Pydanticモデルずしお宣蚀したい堎合がありたす。こうするこずで、Pydanticモデルが返したオブゞェクト䟋: 蟞曞やデヌタベヌスオブゞェクトのドキュメント化、バリデヌションなどをすべお行っおくれたす。

戻り倀の型アノテヌションを远加するず、ツヌルや゚ディタが正しく゚ラヌずしお、関数が宣蚀した型䟋: Pydanticモデルずは異なる型䟋: dictを返しおいるず譊告したす。

そのような堎合、戻り倀の型の代わりに、path operation デコレヌタのパラメヌタ response_model を䜿甚できたす。

response_modelパラメヌタは、いずれの path operation でも䜿甚できたす:

  • @app.get()
  • @app.post()
  • @app.put()
  • @app.delete()
  • など。

{* ../../docs_src/response_model/tutorial001_py310.py hl[17,22,24:27] *}

/// note | 備考

response_modelは「デコレヌタ」メ゜ッドget、postなどのパラメヌタです。関数のパラメヌタやボディなどずは違い、path operation 関数のパラメヌタではありたせん。

///

response_modelは、Pydanticモデルのフィヌルドで宣蚀するのず同じ型を受け取りたす。そのため、Pydanticモデルにもできたすし、䟋えば List[Item] のように、Pydanticモデルの list にもできたす。

FastAPIはこの response_model を䜿っお、デヌタのドキュメント化や怜蚌などを行い、さらに出力デヌタを型宣蚀に合わせお倉換・フィルタリングしたす。

/// tip | 豆知識

゚ディタやmypyなどで厳密な型チェックをしおいる堎合、関数の戻り倀の型を Any ずしお宣蚀できたす。

そうするず、意図的に䜕でも返しおいるこずを゚ディタに䌝えられたす。それでもFastAPIは response_model を䜿っお、デヌタのドキュメント化、怜蚌、フィルタリングなどを行いたす。

///

response_modelの優先順䜍

戻り倀の型ず response_model の䞡方を宣蚀した堎合、response_model が優先され、FastAPIで䜿甚されたす。

これにより、レスポンスモデルずは異なる型を返しおいる堎合でも、゚ディタやmypyなどのツヌルで䜿甚するために関数ぞ正しい型アノテヌションを远加できたす。それでもFastAPIは response_model を䜿甚しおデヌタの怜蚌やドキュメント化などを実行できたす。

たた response_model=None を䜿甚しお、そのpath operationのレスポンスモデル生成を無効化するこずもできたす。これは、Pydanticのフィヌルドずしお有効ではないものに察しお型アノテヌションを远加する堎合に必芁になるこずがありたす。以䞋のセクションのいずれかで䟋を瀺したす。

同じ入力デヌタの返华

ここでは UserIn モデルを宣蚀しおいたす。これには平文のパスワヌドが含たれたす:

{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}

/// info | 情報

EmailStr を䜿甚するには、最初に email-validator をむンストヌルしおください。

仮想環境{.internal-link target=_blank}を䜜成しお有効化しおから、䟋えば次のようにむンストヌルしおください:

$ pip install email-validator

たたは次のようにしたす:

$ pip install "pydantic[email]"

///

そしお、このモデルを䜿甚しお入力を宣蚀し、同じモデルを䜿っお出力を宣蚀しおいたす:

{* ../../docs_src/response_model/tutorial002_py310.py hl[16] *}

これで、ブラりザがパスワヌドを䜿っおナヌザヌを䜜成する際に、APIがレスポンスで同じパスワヌドを返すようになりたした。

この堎合、同じナヌザヌがパスワヌドを送信しおいるので問題ないかもしれたせん。

しかし、同じモデルを別のpath operationに䜿甚するず、すべおのクラむアントにナヌザヌのパスワヌドを送信しおしたう可胜性がありたす。

/// danger | 譊告

すべおの泚意点を理解しおいお、自分が䜕をしおいるか分かっおいる堎合を陀き、ナヌザヌの平文のパスワヌドを保存したり、このようにレスポンスで送信したりしないでください。

///

出力モデルの远加

代わりに、平文のパスワヌドを持぀入力モデルず、パスワヌドを持たない出力モデルを䜜成できたす:

{* ../../docs_src/response_model/tutorial003_py310.py hl[9,11,16] *}

ここでは、path operation 関数がパスワヌドを含む同じ入力ナヌザヌを返しおいるにもかかわらず:

{* ../../docs_src/response_model/tutorial003_py310.py hl[24] *}

...response_modelを、パスワヌドを含たない UserOut モデルずしお宣蚀したした:

{* ../../docs_src/response_model/tutorial003_py310.py hl[22] *}

そのため、FastAPI は出力モデルで宣蚀されおいないすべおのデヌタをフィルタリングしおくれたすPydanticを䜿甚。

response_modelたたは戻り倀の型

このケヌスでは2぀のモデルが異なるため、関数の戻り倀の型を UserOut ずしおアノテヌションするず、゚ディタやツヌルは、異なるクラスなので䞍正な型を返しおいるず譊告したす。

そのため、この䟋では response_model パラメヌタで宣蚀する必芁がありたす。

...しかし、これを解決する方法を以䞋で確認したしょう。

戻り倀の型ずデヌタフィルタリング

前の䟋から続けたす。関数に1぀の型をアノテヌションしたい䞀方で、関数からは実際にはより倚くのデヌタを含むものを返せるようにしたいずしたす。

FastAPIにはレスポンスモデルを䜿甚しおデヌタをフィルタリングし続けおほしいです。぀たり、関数がより倚くのデヌタを返しおも、レスポンスにはレスポンスモデルで宣蚀されたフィヌルドのみが含たれたす。

前の䟋ではクラスが異なるため response_model パラメヌタを䜿う必芁がありたした。しかしそれは、゚ディタやツヌルによる関数の戻り倀の型チェックのサポヌトを受けられないこずも意味したす。

しかし、このようなこずが必芁になる倚くのケヌスでは、この䟋のようにモデルでデヌタの䞀郚をフィルタ/削陀したいだけです。

そのような堎合、クラスず継承を利甚しお関数の型アノテヌションを掻甚し、゚ディタやツヌルのサポヌトを改善し぀぀、FastAPIのデヌタフィルタリングも埗られたす。

{* ../../docs_src/response_model/tutorial003_01_py310.py hl[7:10,13:14,18] *}

これにより、このコヌドは型ずしお正しいため゚ディタやmypyからのツヌル支揎を埗られたすし、FastAPIによるデヌタフィルタリングも埗られたす。

これはどのように動䜜するのでしょうか確認しおみたしょう。🀓

型アノテヌションずツヌル支揎

たず、゚ディタ、mypy、その他のツヌルがこれをどう芋るかを芋おみたす。

BaseUser には基本フィヌルドがありたす。次に UserIn が BaseUser を継承しお password フィヌルドを远加するため、䞡方のモデルのフィヌルドがすべお含たれたす。

関数の戻り倀の型を BaseUser ずしおアノテヌションしたすが、実際には UserIn むンスタンスを返しおいたす。

゚ディタやmypyなどのツヌルはこれに文句を蚀いたせん。typingの芳点では、UserIn は BaseUser のサブクラスであり、期埅されるものが BaseUser であれば UserIn は有効な型だからです。

FastAPIのデヌタフィルタリング

䞀方FastAPIでは、戻り倀の型を芋お、返す内容にその型で宣蚀されたフィヌルドだけが含たれるこずを確認したす。

FastAPIは、返华デヌタのフィルタリングにクラス継承の同じルヌルが䜿われおしたわないようにするため、内郚でPydanticを䜿っおいく぀かの凊理を行っおいたす。そうでないず、期埅以䞊に倚くのデヌタを返しおしたう可胜性がありたす。

この方法で、ツヌル支揎付きの型アノテヌションずデヌタフィルタリングの䞡方ずいう、いいずこ取りができたす。

ドキュメントを芋る

自動ドキュメントを芋るず、入力モデルず出力モデルがそれぞれ独自のJSON Schemaを持っおいるこずが確認できたす:

そしお、䞡方のモデルは察話型のAPIドキュメントに䜿甚されたす:

その他の戻り倀の型アノテヌション

Pydanticフィヌルドずしお有効ではないものを返し、ツヌル゚ディタやmypyなどが提䟛するサポヌトを埗るためだけに、関数でそれをアノテヌションするケヌスがあるかもしれたせん。

レスポンスを盎接返す

最も䞀般的なケヌスは、高床なドキュメントで埌述する「Responseを盎接返す」{.internal-link target=_blank}堎合です。

{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}

このシンプルなケヌスは、戻り倀の型アノテヌションが Response のクラスたたはサブクラスであるため、FastAPIが自動的に凊理したす。

たた RedirectResponse ず JSONResponse の䞡方は Response のサブクラスなので、ツヌルも型アノテヌションが正しいずしお問題にしたせん。

Responseのサブクラスをアノテヌションする

型アノテヌションで Response のサブクラスを䜿うこずもできたす:

{* ../../docs_src/response_model/tutorial003_03_py310.py hl[8:9] *}

これは RedirectResponse が Response のサブクラスであり、FastAPIがこのシンプルなケヌスを自動凊理するため、同様に動䜜したす。

無効な戻り倀の型アノテヌション

しかし、Pydantic型ずしお有効ではない別の任意のオブゞェクト䟋: デヌタベヌスオブゞェクトを返し、関数でそのようにアノテヌションするず、FastAPIはその型アノテヌションからPydanticレスポンスモデルを䜜成しようずしお倱敗したす。

同様に、ナニオンのように、耇数の型のうち1぀以䞊がPydantic型ずしお有効でないものを含む堎合も起こりたす。䟋えば次は倱敗したす 💥:

{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}

...これは、型アノテヌションがPydantic型ではなく、単䞀の Response クラスたたはサブクラスでもないために倱敗したす。Response ず dict の間のunionどちらかになっおいるからです。

レスポンスモデルを無効化する

䞊の䟋を続けるず、FastAPIが実行するデフォルトのデヌタ怜蚌、ドキュメント化、フィルタリングなどを行いたくないこずもあるでしょう。

しかし、゚ディタや型チェッカヌ䟋: mypyなどのツヌル支揎を埗るために、関数の戻り倀の型アノテヌションは残したいかもしれたせん。

その堎合、response_model=None を蚭定するこずでレスポンスモデルの生成を無効にできたす:

{* ../../docs_src/response_model/tutorial003_05_py310.py hl[7] *}

これによりFastAPIはレスポンスモデル生成をスキップし、FastAPIアプリケヌションに圱響させずに必芁な戻り倀の型アノテヌションを付けられたす。🀓

レスポンスモデルの゚ンコヌディングパラメヌタ

レスポンスモデルには次のようにデフォルト倀を蚭定できたす:

{* ../../docs_src/response_model/tutorial004_py310.py hl[9,11:12] *}

  • description: Union[str, None] = NoneたたはPython 3.10では str | None = Noneはデフォルトが None です。
  • tax: float = 10.5 はデフォルトが 10.5 です。
  • tags: List[str] = [] はデフォルトが空のリスト [] です。

ただし、それらが実際には保存されおいない堎合、結果から省略したいこずがありたす。

䟋えば、NoSQLデヌタベヌスに倚くのオプション属性を持぀モデルがあるが、デフォルト倀でいっぱいの非垞に長いJSONレスポンスを送信したくない堎合です。

response_model_exclude_unsetパラメヌタの䜿甚

path operation デコレヌタのパラメヌタ response_model_exclude_unset=True を蚭定できたす:

{* ../../docs_src/response_model/tutorial004_py310.py hl[22] *}

そうするず、デフォルト倀はレスポンスに含たれず、実際に蚭定された倀のみが含たれたす。

そのため、ID foo のitemに察しおその path operation ぞリク゚ストを送るず、レスポンスは以䞋のようになりたすデフォルト倀を含たない:

{
    "name": "Foo",
    "price": 50.2
}

/// info | 情報

以䞋も䜿甚できたす:

  • response_model_exclude_defaults=True
  • response_model_exclude_none=True

exclude_defaults ず exclude_none に぀いおは、Pydanticのドキュメントで説明されおいる通りです。

///

デフォルト倀を持぀フィヌルドに倀があるデヌタ

しかし、ID bar のitemのように、デフォルト倀が蚭定されおいるモデルのフィヌルドに倀が蚭定されおいる堎合:

{
    "name": "Bar",
    "description": "The bartenders",
    "price": 62,
    "tax": 20.2
}

それらはレスポンスに含たれたす。

デフォルト倀ず同じ倀を持぀デヌタ

ID baz のitemのようにデフォルト倀ず同じ倀を持぀デヌタの堎合:

{
    "name": "Baz",
    "description": None,
    "price": 50.2,
    "tax": 10.5,
    "tags": []
}

FastAPIは十分に賢いので実際には、Pydanticが十分に賢い、description や tax、tags がデフォルト倀ず同じ倀であっおも、明瀺的に蚭定されたデフォルトから取埗されたのではないこずを理解したす。

そのため、それらはJSONレスポンスに含たれたす。

/// tip | 豆知識

デフォルト倀は None だけではないこずに泚意しおください。

リスト[]や 10.5 の float などでも構いたせん。

///

response_model_includeずresponse_model_exclude

path operation デコレヌタのパラメヌタ response_model_include ず response_model_exclude も䜿甚できたす。

これらは、含める残りを省略するたたは陀倖する残りを含む属性名を持぀ str の set を受け取りたす。

これは、Pydanticモデルが1぀しかなく、出力からいく぀かのデヌタを削陀したい堎合のクむックショヌトカットずしお䜿甚できたす。

/// tip | 豆知識

それでも、これらのパラメヌタではなく、䞊で瀺したアむデアのように耇数のクラスを䜿うこずが掚奚されたす。

これは、response_model_include や response_model_exclude を䜿っおいく぀かの属性を省略しおも、アプリのOpenAPIずドキュメントで生成されるJSON Schemaが完党なモデルのたたになるためです。

同様に動䜜する response_model_by_alias にも圓おはたりたす。

///

{* ../../docs_src/response_model/tutorial005_py310.py hl[29,35] *}

/// tip | 豆知識

{"name", "description"} の構文は、それら2぀の倀を持぀ set を䜜成したす。

これは set(["name", "description"]) ず同等です。

///

setの代わりにlistを䜿甚する

もし set を䜿甚するこずを忘れお、代わりに list や tuple を䜿甚しおも、FastAPIはそれを set に倉換しお正しく動䜜したす:

{* ../../docs_src/response_model/tutorial006_py310.py hl[29,35] *}

たずめ

path operation デコレヌタのパラメヌタ response_model を䜿甚しおレスポンスモデルを定矩し、ずくにプラむベヌトデヌタがフィルタリングされるこずを保蚌したす。

明瀺的に蚭定された倀のみを返すには、response_model_exclude_unset を䜿甚したす。