如何控制Pydantic生成的字段标签(title)的生成规则?
控制Pydantic模型字段"title"属性的生成方法
1. 手动指定单个字段的Title
如果仅需修改个别字段的title,直接通过Field参数显式设置即可,该方式优先级最高,会覆盖自动生成的结果:
import pydantic from pydantic import Field class Creator(pydantic.BaseModel): firstName: str = Field(None, title="First Name") lastName: str = Field(None, title="Last Name") middle_name: str = None # 保持自动生成的"Middle Name"
2. 自定义全局Title生成规则(推荐)
根据Pydantic版本不同,实现方式略有差异:
Pydantic v2及以上版本
利用模型配置中的title_generator参数,传入自定义函数统一处理字段名到title的转换:
import pydantic from pydantic import BaseModel def custom_title(field_name: str) -> str: # 处理驼峰命名拆分+下划线替换,转为标题大小写 processed = [] for idx, char in enumerate(field_name): if idx > 0 and char.isupper() and field_name[idx-1].islower(): processed.append(" ") processed.append(char) return "".join(processed).title().replace("_", " ") class Creator(BaseModel): firstName: str = None lastName: str = None middle_name: str = None model_config = { "title_generator": custom_title }
生成的Schema中,所有字段的title都会按规则生成:firstName对应"First Name",lastName对应"Last Name",middle_name对应"Middle Name"。
Pydantic v1版本
v1无内置title_generator,可通过schema_extra方法遍历修改Schema的title属性:
import pydantic def custom_title(field_name: str) -> str: processed = [] for idx, char in enumerate(field_name): if idx > 0 and char.isupper() and field_name[idx-1].islower(): processed.append(" ") processed.append(char) return "".join(processed).title().replace("_", " ") class Creator(pydantic.BaseModel): firstName: str = None lastName: str = None middle_name: str = None class Config: @staticmethod def schema_extra(schema, model): for field_name, field_schema in schema["properties"].items(): field_schema["title"] = custom_title(field_name)
3. 借助第三方库简化转换逻辑
使用inflection库的titleize方法,可一键处理驼峰、下划线命名的转换:
import pydantic from pydantic import BaseModel import inflection class Creator(BaseModel): firstName: str = None lastName: str = None middle_name: str = None model_config = { "title_generator": inflection.titleize }
inflection.titleize会自动将firstName转为"First Name",middle_name转为"Middle Name",无需手动编写转换逻辑。
内容的提问来源于stack exchange,提问作者PChemGuy
相关产品推荐
相关产品推荐

