获取 pydantic 类的所有字段名称的简短方法

5th*_*5th 31 python oop pydantic

该类的最小示例:

from pydantic import BaseModel

class AdaptedModel(BaseModel):
    def get_all_fields(self, alias=False):
        return list(self.schema(by_alias=alias).get("properties").keys())

class TestClass(AdaptedModel):
    test: str
Run Code Online (Sandbox Code Playgroud)

它的工作原理:

dm.TestClass.get_all_fields(dm.TestClass)
Run Code Online (Sandbox Code Playgroud)

有没有办法让它发挥作用而不需要再次上课?

获取所有字段名称所需的方式:

dm.TestClass.get_all_fields()
Run Code Online (Sandbox Code Playgroud)

如果将字段名称分配给属性,它也会起作用。只要有办法让它更具可读性

mik*_*sus 51

只使用怎么样__fields__

from pydantic import BaseModel

class AdaptedModel(BaseModel):
    parent_attr: str

class TestClass(AdaptedModel):
    child_attr: str
        
TestClass.__fields__
Run Code Online (Sandbox Code Playgroud)

输出:

{'parent_attr': ModelField(name='parent_attr', type=str, required=True),
 'child_attr': ModelField(name='child_attr', type=str, required=True)}
Run Code Online (Sandbox Code Playgroud)

这只是一个字典,您可以通过以下方式仅获取字段名称:TestClass.__fields__.keys()

查看模型属性:https://pydantic-docs.helpmanual.io/usage/models/#model-properties

  • `__fields__` 属性已弃用,请使用 `model_fields` 代替。 (8认同)
  • 这当然有效,但我不认为使用像 __fields__ 这样的受限属性是执行此操作的 Python 方式。既然受到限制,那也是有原因的。我会选择@5th 建议的 classmethod 解决方案 (3认同)

5th*_*5th 12

2024 年 1 月更新:这个答案是我在 pydantic v1 之前获取字段的方法。在 v1 中__fields__添加了。然后随着model_fieldsv2 的引入,这一点被弃用了。


好吧,解决方案是使用类方法而不是实例方法

from pydantic import BaseModel, Field

class AdaptedModel(BaseModel):
    @classmethod
    def get_field_names(cls,alias=False):
        return list(cls.schema(alias).get("properties").keys())

class TestClass(AdaptedModel):
    test: str = Field(alias="TEST")
Run Code Online (Sandbox Code Playgroud)

我们正在使用Python 3.6.8,显然它已经被引入了。为了完整起见,有人可以发表评论吗@classmethod?我假设从 3.6 开始。