Return pydantic 根验证器中的列表表示
Return list representation in pydantic root validator
我正在使用 pydantic 来验证来自 REST 的数据 API 到目前为止我真的很喜欢这个包:
from datetime import datetime
from typing import Optional, List, Union
from pydantic import BaseModel, Field, root_validator
from pprint import pprint
my_devices = {
"devices": [
{
"modifyTimestamp": "2022-01-17T13:35:58.597569Z",
"vehicleId": "VINWVWZZZAUZLW9191234",
}
],
"modifyTimestamp": "2022-01-17T13:35:58.597569Z",
}
class Device(BaseModel):
vehicle_id: str = Field(alias="vehicleId")
modify_timestamp: datetime = Field(alias="modifyTimestamp")
class DeviceList(BaseModel):
__root__: List[Device]
validated_data = DeviceList(__root__=my_devices["devices"])
print(validated_data)
validated_data_list = [v.dict() for v in validated_data.__root__]
print(validated_data_list)
返回:
__root__=[Device(vehicle_id='VINWVWZZZAUZLW9191234', modify_timestamp=datetime.datetime(2022, 1, 17, 13, 35, 58, 597569, tzinfo=datetime.timezone.utc))]
[{'vehicle_id': 'VINWVWZZZAUZLW9191234', 'modify_timestamp': datetime.datetime(2022, 1, 17, 13, 35, 58, 597569, tzinfo=datetime.timezone.utc)}]
但是访问 __root__
并从中创建列表对我来说似乎有点复杂。
这是直接 implement/obtain validated_data_list
中的(原始)列表和字典表示的唯一方法吗?
提前致谢!
如果我答对了你的问题,你正在寻找 BaseModel class 的 .json()
方法。
from datetime import datetime
from typing import Optional, List, Union
from pydantic import BaseModel, Field, root_validator
my_devices = {
"devices": [
{
"modifyTimestamp": "2022-01-17T13:35:58.597569Z",
"vehicleId": "VINWVWZZZAUZLW9191234",
}
],
"modifyTimestamp": "2022-01-17T13:35:58.597569Z",
}
class Device(BaseModel):
vehicle_id: str = Field(alias="vehicleId")
modify_timestamp: datetime = Field(alias="modifyTimestamp")
class DeviceList(BaseModel):
__root__: List[Device]
validated_data = DeviceList(__root__=my_devices["devices"])
validated_data_list = validated_data.json()
print(validated_data_list)
输出:
[{"vehicle_id": "VINWVWZZZAUZLW9191234", "modify_timestamp": "2022-01-17T13:35:58.597569+00:00"}]
现在,由于您没有为 datetime
字段声明任何序列化程序,Pydantic 已使用其默认值将 datetime
转换为 str
,这为您提供了“+00 :00" 部分代替通常的 "Z" 后缀。但是,您可以声明自己的序列化以打印您喜欢的日期。 This answer 对如何做到这一点有很好的解释。
希望我有所帮助。
我正在使用 pydantic 来验证来自 REST 的数据 API 到目前为止我真的很喜欢这个包:
from datetime import datetime
from typing import Optional, List, Union
from pydantic import BaseModel, Field, root_validator
from pprint import pprint
my_devices = {
"devices": [
{
"modifyTimestamp": "2022-01-17T13:35:58.597569Z",
"vehicleId": "VINWVWZZZAUZLW9191234",
}
],
"modifyTimestamp": "2022-01-17T13:35:58.597569Z",
}
class Device(BaseModel):
vehicle_id: str = Field(alias="vehicleId")
modify_timestamp: datetime = Field(alias="modifyTimestamp")
class DeviceList(BaseModel):
__root__: List[Device]
validated_data = DeviceList(__root__=my_devices["devices"])
print(validated_data)
validated_data_list = [v.dict() for v in validated_data.__root__]
print(validated_data_list)
返回:
__root__=[Device(vehicle_id='VINWVWZZZAUZLW9191234', modify_timestamp=datetime.datetime(2022, 1, 17, 13, 35, 58, 597569, tzinfo=datetime.timezone.utc))]
[{'vehicle_id': 'VINWVWZZZAUZLW9191234', 'modify_timestamp': datetime.datetime(2022, 1, 17, 13, 35, 58, 597569, tzinfo=datetime.timezone.utc)}]
但是访问 __root__
并从中创建列表对我来说似乎有点复杂。
这是直接 implement/obtain validated_data_list
中的(原始)列表和字典表示的唯一方法吗?
提前致谢!
如果我答对了你的问题,你正在寻找 BaseModel class 的 .json()
方法。
from datetime import datetime
from typing import Optional, List, Union
from pydantic import BaseModel, Field, root_validator
my_devices = {
"devices": [
{
"modifyTimestamp": "2022-01-17T13:35:58.597569Z",
"vehicleId": "VINWVWZZZAUZLW9191234",
}
],
"modifyTimestamp": "2022-01-17T13:35:58.597569Z",
}
class Device(BaseModel):
vehicle_id: str = Field(alias="vehicleId")
modify_timestamp: datetime = Field(alias="modifyTimestamp")
class DeviceList(BaseModel):
__root__: List[Device]
validated_data = DeviceList(__root__=my_devices["devices"])
validated_data_list = validated_data.json()
print(validated_data_list)
输出:
[{"vehicle_id": "VINWVWZZZAUZLW9191234", "modify_timestamp": "2022-01-17T13:35:58.597569+00:00"}]
现在,由于您没有为 datetime
字段声明任何序列化程序,Pydantic 已使用其默认值将 datetime
转换为 str
,这为您提供了“+00 :00" 部分代替通常的 "Z" 后缀。但是,您可以声明自己的序列化以打印您喜欢的日期。 This answer 对如何做到这一点有很好的解释。
希望我有所帮助。