为什么我不能在 pydantic 的列表中指定多个类型


class Embedded(BaseModel):
path: str
items: list[Union[ResourceItemDir, ResourceItemFile]] # here
limit: int
offset: int
sort: str
total: int
class ResourceItemFile(BaseModel):
name: str
path: str
size: int
file: str
resource_id: str
created: datetime.datetime
modified: datetime.datetime
media_type: str
antivirus_status: str
comment_ids: dict
exif: dict
md5: str
mime_type: str
preview: str
revision: int
sha256: str
share: dict
type: Literal["file"]
class ResourceItemDir(BaseModel):
name: str
path: str
comment_ids: dict
created: datetime.datetime
exif: dict
modified: datetime.datetime
public_key: str
public_url: str
resource_id: str
revision: int
share: dict
type: Literal["dir"]

为什么不能在pydantic中指定多个类型?我还可以如何指定items字段接受两种数据类型?如果有想法,我应该如何不同地执行它?

现在这样的错误:

File "pydanticmain.py", line 331, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 99 validation errors for Resource
embedded -> items -> 2 -> public_key
field required (type=value_error.missing)
embedded -> items -> 2 -> public_url
field required (type=value_error.missing)
embedded -> items -> 2 -> size
field required (type=value_error.missing)
embedded -> items -> 2 -> file
field required (type=value_error.missing)
embedded -> items -> 2 -> media_type
field required (type=value_error.missing)
embedded -> items -> 2 -> antivirus_status
field required (type=value_error.missing)
embedded -> items -> 2 -> md5
field required (type=value_error.missing)
embedded -> items -> 2 -> mime_type
field required (type=value_error.missing)
embedded -> items -> 2 -> preview
field required (type=value_error.missing)
embedded -> items -> 2 -> sha256
field required (type=value_error.missing)
embedded -> items -> 2 -> type
unexpected value; permitted: 'file' (type=value_error.const; given=dir; permitted=('file',))

我想我找到了一个解决方案,使用Annotated from pedantic

class AbstractResourceItem(BaseModel):
name: str
path: str
comment_ids: dict
created: datetime.datetime
modified: datetime.datetime
exif: dict
resource_id: str
revision: int
share: dict
public_key: Optional[str]
public_url: Optional[str]

class ResourceItemFile(AbstractResourceItem):
size: int
file: str
media_type: str
antivirus_status: str
md5: str
mime_type: str
preview: str
sha256: str
type: Literal["file"]

class ResourceItemDir(AbstractResourceItem):
embedded: Optional["Embedded"]
type: Literal["dir"]
#here
ResourceItem = Annotated[
Union[ResourceItemDir, ResourceItemFile],
Field(discriminator="type")
]

class Embedded(BaseModel):
path: str
items: list[ResourceItem]
limit: int
offset: int
sort: str
total: int