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