当前位置: 首页 > 知识库问答 >
问题:

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

关飞翼
2023-12-17

如何通过代码获取 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, Fieldclass 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_lengthdescription_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'

共有2个答案

晋越彬
2023-12-17

解决了

下面是 pydantic v1 中的用法

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

from pydantic import BaseModel, Fieldclass 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_lengthdescription_max_length = MetaCollection.__fields__["description"].field_info.max_lengthprint(description_max_length)

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

宇文温文
2023-12-17

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

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

pip install --upgrade pydantic

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

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

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

 类似资料:
  • 我试图制作一个方法,获取封闭实例中的任何字段,对于一对2D坐标(其字段名以“X”结尾)的任何“X”组件具有整数值。 但我在编译器中得到的只是: 方法将这样使用: 我做错了什么?

  • 问题内容: 我创建了一个简单的注释类: 我在像这样的一些类中使用它: 我知道我可以遍历声明的字段并获得如下注释: 如何在不迭代类的声明字段的情况下直接通过带注释的名称获取字段? 问题答案: 如果需要进行多次访问,则可以预处理注释。

  • 问题内容: 给定Django模型,我试图列出其所有字段。我已经看到了使用_meta模型属性执行此操作的一些示例,但是meta前面的下划线是否表示_meta属性是私有属性,不应直接访问?…例如,因为_meta的布局将来可能会更改,并且不是稳定的API? _meta是该规则的例外吗?它是否稳定且可以使用,还是访问它的不正确做法?还是有一种功能或其他方法可以在不使用_meta属性的情况下自省模型的字段?

  • 问题内容: 我在Java中有一个对象(基本上是VO),但不知道其类型。 我需要获取在该对象中不为null的值。 如何才能做到这一点? 问题答案: 你可以用来获取该类的所有声明的字段。你可以用来获取价值。 简而言之: 要了解有关反射的更多信息,请查看有关该主题的Sun教程。 就是说,这些字段不一定全部代表VO的属性。你希望确定以或开头的公共方法,然后调用它以获取真实属性值。 也就是说,可能会有更优雅

  • 我已经在WordPress的编辑帖子部分创建了一个自定义字段,并且能够通过以下帖子保存该值:Wordpress-将自定义字段添加到帖子屏幕。 我可以检索特定类别的帖子,但无法检索自定义字段的值。 如上图所示,在左上角高亮显示的位置有一个自定义的post字段。另一个突出显示的字段是显示帖子属于“公文包”类别。 下面是我用来检索“Portfolio”类别帖子的代码 我可以得到文章标题和内容的值,但不能

  • 我有一个方法,它返回字符串类型的字段对象列表。 这个方法应该将所有字符串字段都大写: 问题是:"field.set(...)"不起作用。它应该将值大写并将其设置为该字段的新值,但它不起作用...我如何解决这个问题的任何想法?(PS:在真正的代码中,"something Class.class"被设置为真正的类名...) 正在生成的错误是field.get(this)方法(insdefield.se