如何通过代码获取 pydantic 模型的定义的某个字段的 max_length 取值?

如何通过代码获取 pydantic 模型的定义的某个字段的 max_length 取值?

比如获取 description 的 max_length 的值

class MetaCollection(BaseModel):
    id: int | None = Field(default=None)
    collection_name: str = Field(max_length=64)
    description: str | None = Field(None, max_length=1024)
    meta_type: MetaType = Field()
    company_id: int = Field(...)
    default_selected: bool = Field(default=False)
    meta_count: int = Field(default=0, help_text='去正常化设计')
    timer_count: int = Field(default=0, help_text='去正常化设计')

chatGPT 的回答,我跑了一下不行

你可以使用 Python 的 get_field 方法来访问 Pydantic 模型字段的元数据,包括 max_length。在你的情况下,你可以这样做:

from pydantic import BaseModel, Field

class MetaCollection(BaseModel):
    id: int | None = Field(default=None)
    collection_name: str = Field(max_length=64)
    description: str | None = Field(None, max_length=1024)
    # ... 其他字段

# 获取 description 字段的 max_length
description_max_length = MetaCollection.__fields__["description"].field_info.extra["max_length"]
print(description_max_length)

这段代码中,MetaCollection.__fields__["description"] 可以访问到 description 字段的元数据,然后通过 .field_info.extra["max_length"] 来获取 max_length 的值。

记得替换 MetaCollection 为你实际定义的模型名称,以及替换字段名如果你想获取其他字段的 max_length

会报错

Traceback (most recent call last):
  File "/home/pon/Desktop/code/me/ideaboom/001.py", line 10, in <module>
    description_max_length = MetaCollection.__fields__["description"].field_info.extra["max_length"]
KeyError: 'max_length'
阅读 1.1k
avatarAI BotBETA

这个问题可能是因为 Pydantic 版本的问题。在你提供的代码中,你尝试访问的 max_length 键在某些 Pydantic 版本中可能并不存在。你可以通过更新 Pydantic 到最新版本来解决这个问题。

你可以使用以下命令来更新 Pydantic:

pip install --upgrade pydantic

更新后,你的代码应该可以正常工作。如果你仍然遇到问题,那可能是因为你的 Pydantic 版本不兼容你的代码。在这种情况下,我建议你检查你的 Pydantic 版本,并确保它与你的代码兼容。

如果你想获取的字段不存在,例如在 Pydantic 的 BaseModel 中,那么 __fields__ 字典中就不会有那个字段,尝试访问 max_length 就会抛出 KeyError

如果你想获取的字段是嵌套在更深层的类中,你可能需要使用更复杂的代码来访问它。例如,如果 description 是在一个嵌套的类中定义的,你可能需要首先获取到那个嵌套类,然后再访问它的 __fields__ 字典。

1 个回答

解决了

下面是 pydantic v1 中的用法

在 Pydantic 中,max_length 是存储在 field_info 对象的 max_length 属性中的,而不是 extra 字典中。

from pydantic import BaseModel, Field

class MetaCollection(BaseModel):
    id: int | None = Field(default=None)
    collection_name: str = Field(max_length=64)
    description: str | None = Field(None, max_length=1024)
    # ... 其他字段

# 获取 description 字段的 max_length
description_max_length = MetaCollection.__fields__["description"].field_info.max_length
print(description_max_length)

至于 pydantic v2 版本下如何获取,我去提问了:https://github.com/pydantic/pydantic/discussions/8388

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏