You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:56:24