Pydantic 不会将子类转换为字典
Pydantic doesn't convert subclass to dict
我有以下 类:
from pydantic import BaseModel
class ProviderMilestoneData(BaseModel):
sequence_number: str = None
event_code: str = None
actual_date: str = None
description: str = None
condition_type: str = None
estimated_date: str = None
class ProviderShipmentParsedResponse(BaseModel):
...
...
shipment_milestones: List[ProviderMilestoneData] = None
invoices: List[ProviderInvoiceData] = None
当我尝试使用 shipment_data.dict()
解析 shipment_data = ProviderShipmentParsedResponse()
的实例时,
由于某种原因 shipment_milestones
没有解析为 json:
{
...
'shipment_milestones': [_Pydantic_ProviderMilestoneData_94511125253024(sequence_number = '10', event_code = 'XXX', actual_date = '2021-03-01T15:41:36.493', description = 'REDACTED', condition_type = None, estimated_date = None), _Pydantic_ProviderMilestoneData_94511125253024(sequence_number = '20', event_code = 'XXX', actual_date = None, description = 'REDACTED', condition_type = None, estimated_date = '2021-02-23T00:00:00'), _Pydantic_ProviderMilestoneData_94511125253024(sequence_number = '31', event_code = 'XXX', actual_date = None, description = 'REDACTED, condition_type = None, estimated_date = None), _Pydantic_ProviderMilestoneData_94511125253024(sequence_number = '90', event_code = 'XXX', actual_date = '2021-03-01T15:44:04.29', description = 'REDACTED', condition_type = 'XXX', estimated_date = None), _Pydantic_ProviderMilestoneData_94511125253024(sequence_number = '91', event_code = 'XXX', actual_date = '2021-03-01T15:43:53.473', description = 'REDACTED', condition_type = None, estimated_date = None)],
...
}
我哪里做错了,我怎样才能确保整个对象变成字典?
根据 pydantic 文档,我认为您正在寻找的是 parse_obj
.. 它“接受”“原语”而不是关键字参数。
parse_obj: this is very similar to the __init__ method of the model, except it takes a dict rather than keyword arguments. If the object passed is not a dict a ValidationError will be raised.
所以对于您的用例
class TestChild(BaseModel):
a: str = "a"
b: str = "b"
class TestOtherChild(BaseModel):
other: str = "Other"
class TestRoot(BaseModel):
l: List[TestChild] = None
ll: List[TestOtherChild]
test_root = TestRoot.parse_obj({"l": [TestChild(a="a")], "ll": [{"other": "Other"}]})
print(test_root.dict()) # {"l": [{"a": "c", "b": "b"}], "ll":[{"other": "Other"}]}
好的,问题是我必须在可选字段附近明确添加 Optional
:
class ProviderMilestoneData(BaseModel):
sequence_number: Optional[str] = None
event_code: Optional[str] = None
actual_date: Optional[str] = None
description: Optional[str] = None
condition_type: Optional[str] = None
estimated_date: Optional[str] = None
class ProviderShipmentParsedResponse(BaseModel):
...
...
shipment_milestones: Optional[List[ProviderMilestoneData]] = None
invoices: Optional[List[ProviderInvoiceData]] = None
我有以下 类:
from pydantic import BaseModel
class ProviderMilestoneData(BaseModel):
sequence_number: str = None
event_code: str = None
actual_date: str = None
description: str = None
condition_type: str = None
estimated_date: str = None
class ProviderShipmentParsedResponse(BaseModel):
...
...
shipment_milestones: List[ProviderMilestoneData] = None
invoices: List[ProviderInvoiceData] = None
当我尝试使用 shipment_data.dict()
解析 shipment_data = ProviderShipmentParsedResponse()
的实例时,
由于某种原因 shipment_milestones
没有解析为 json:
{
...
'shipment_milestones': [_Pydantic_ProviderMilestoneData_94511125253024(sequence_number = '10', event_code = 'XXX', actual_date = '2021-03-01T15:41:36.493', description = 'REDACTED', condition_type = None, estimated_date = None), _Pydantic_ProviderMilestoneData_94511125253024(sequence_number = '20', event_code = 'XXX', actual_date = None, description = 'REDACTED', condition_type = None, estimated_date = '2021-02-23T00:00:00'), _Pydantic_ProviderMilestoneData_94511125253024(sequence_number = '31', event_code = 'XXX', actual_date = None, description = 'REDACTED, condition_type = None, estimated_date = None), _Pydantic_ProviderMilestoneData_94511125253024(sequence_number = '90', event_code = 'XXX', actual_date = '2021-03-01T15:44:04.29', description = 'REDACTED', condition_type = 'XXX', estimated_date = None), _Pydantic_ProviderMilestoneData_94511125253024(sequence_number = '91', event_code = 'XXX', actual_date = '2021-03-01T15:43:53.473', description = 'REDACTED', condition_type = None, estimated_date = None)],
...
}
我哪里做错了,我怎样才能确保整个对象变成字典?
根据 pydantic 文档,我认为您正在寻找的是 parse_obj
.. 它“接受”“原语”而不是关键字参数。
parse_obj: this is very similar to the __init__ method of the model, except it takes a dict rather than keyword arguments. If the object passed is not a dict a ValidationError will be raised.
所以对于您的用例
class TestChild(BaseModel):
a: str = "a"
b: str = "b"
class TestOtherChild(BaseModel):
other: str = "Other"
class TestRoot(BaseModel):
l: List[TestChild] = None
ll: List[TestOtherChild]
test_root = TestRoot.parse_obj({"l": [TestChild(a="a")], "ll": [{"other": "Other"}]})
print(test_root.dict()) # {"l": [{"a": "c", "b": "b"}], "ll":[{"other": "Other"}]}
好的,问题是我必须在可选字段附近明确添加 Optional
:
class ProviderMilestoneData(BaseModel):
sequence_number: Optional[str] = None
event_code: Optional[str] = None
actual_date: Optional[str] = None
description: Optional[str] = None
condition_type: Optional[str] = None
estimated_date: Optional[str] = None
class ProviderShipmentParsedResponse(BaseModel):
...
...
shipment_milestones: Optional[List[ProviderMilestoneData]] = None
invoices: Optional[List[ProviderInvoiceData]] = None