是否可以访问传递给Pydantic BaseModel中的字段的关键字参数?



我需要访问PydanticField中的my_key,如下所示:


class MyModel(BaseModel):
x: str = Field(default=None, my_key=7)
def print_field_objects(self):
for obj in self.something_something:  # What do I use here
print(obj.my_key)                 # ... so that i can use my_key?

我试着看看self包含什么,像self.__dict__,但我没能找到它。有可能访问my_key吗?

我需要它作为我的FastAPI端点。

您可以使用BaseModel.schema()方法生成模型的JSON Schema表示,然后依赖于Field自定义的这个功能:

**任何其他关键字参数(例如examples)将逐字添加到字段的模式

换句话说,传递给Field的任何其他不被Pydantic(或任何自定义创建/实例化)消耗或使用的任意关键字参数将出现在该字段的JSON模式表示中。

因此,在这种情况下,您的my_key应该出现在模型的模式:
In [4]: class MyModel(BaseModel):
...:     x: str = Field(default=None, my_key=7)
...: 
In [5]: MyModel.schema()
Out[5]: 
{'title': 'MyModel',
'type': 'object',
'properties': {'x': {'title': 'X', 'my_key': 7, 'type': 'string'}}}
^^^^^^^^^^^^
||||||||||||

你可以有一个实例方法,看起来像这样:

In [21]: class MyModel(BaseModel):
...:     x: str = Field(default=None, my_key=7)
...:     y: int = Field(default=1, my_key=42)
...: 
...:     def print_field_objects(self):
...:         for field_name, field in self.schema()["properties"].items():
...:             print(field["my_key"])
...: 
In [22]: m1 = MyModel()
In [23]: m1.print_field_objects()
7
42
但是,由于模型的模式和Field定义绑定到,而不是实例,因此多个实例将具有相同的值:
In [28]: m1 = MyModel()
In [29]: m1.print_field_objects()
7
42
In [30]: m2 = MyModel()
In [31]: m2.print_field_objects()
7
42

因此,使其成为一个类方法会更准确,因为my_key无论如何都不会随着x字段的不同值或不同的实例而改变:

In [35]: class MyModel(BaseModel):
...:     x: str = Field(default=None, my_key=7)
...:     y: int = Field(default=1, my_key=42)
...: 
...:     @classmethod
...:     def print_field_objects(cls):
...:         for field_name, field in cls.schema()["properties"].items():
...:             print(field_name, field.get("my_key"))
...: 
In [36]: MyModel.print_field_objects()
x 7
y 42

字段不接受任意参数,您究竟想要实现什么,也许有更合适的解决方案。

根据你的另一个问题,x是一个类属性,其定义可以在self.__class__.__fields__中找到,而它的实例值可以通过调用self.x

找到。

最新更新