我需要访问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