为什么我不能在pydantic的List中指定多种类型

问题描述 投票:0回答:2
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 的 List 中指定多种类型? 我还能如何指定

items
字段接受两种数据类型? 如果有想法我应该如何不同地实施它?

现在出现这样的错误:

  File "pydantic\main.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',))
python types type-hinting pydantic python-dataclasses
2个回答
1
投票

我想我找到了使用迂腐注释的解决方案

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

0
投票

可以通过以下方式使用 python 3.10+:

from pydantic import BaseModel

class User(BaseModel):
    friends: list[int | str] = []

u1 = User(friends=[1, 1, 'foo', 'bar', 1])
© www.soinside.com 2019 - 2024. All rights reserved.