Pydantic v2:如何让带默认值的type字段在OpenAPI Schema中标记为必填?
解决方案
要实现让type字段在OpenAPI规范中被标记为必填,同时实例化Dog时无需传入该参数,可采用以下两种方法:
方法一:通过Field的json_schema_extra强制标记必填
直接在type字段的Field配置中添加json_schema_extra,手动指定该字段为必填:
from pydantic import BaseModel, Field, Annotated, Literal from enum import Enum class PetType(str, Enum): DOG = "Dog" CAT = "Cat" class Pet(BaseModel): name: Annotated[str, Field(..., examples=["Unnamed pet"])] class Dog(Pet): type: Annotated[Literal[PetType.DOG], Field(default=PetType.DOG, json_schema_extra={"required": True})]
方法二:通过模型配置修改schema
在Dog类的model_config中,通过schema_extra覆盖OpenAPI schema的required字段列表:
from pydantic import BaseModel, Field, Annotated, Literal from enum import Enum class PetType(str, Enum): DOG = "Dog" CAT = "Cat" class Pet(BaseModel): name: Annotated[str, Field(..., examples=["Unnamed pet"])] class Dog(Pet): type: Literal[PetType.DOG] = PetType.DOG model_config = { "schema_extra": { "required": ["name", "type"] } }
效果验证
修改后生成的OpenAPI规范中,type会被加入required列表,同时保留默认值:
{ "title": "Dog", "type": "object", "properties": { "name": { "examples": [ "Unnamed pet" ], "title": "Name", "type": "string" }, "type": { "const": "Dog", "default": "Dog", "title": "Type" } }, "required": [ "name", "type" ] }
此时实例化Dog(name="scooby")时,无需传入type参数,模型会自动使用默认值。
内容的提问来源于stack exchange,提问作者helt
相关产品推荐
相关产品推荐

