【问题标题】:Can I get incoming extra fields from Pydantic?我可以从 Pydantic 获取传入的额外字段吗?
【发布时间】:2021-12-05 14:13:22
【问题描述】:

我在 Pydantic Config 中使用extra = Extra.allow 定义了一个 pydantic Sc​​hema。

是否可以单独获取传递给 Schema 的列表或一组额外字段。

例如:

from pydantic import BaseModel as pydanticBaseModel
class BaseModel(pydanticBaseModel):
    name: str

    class Config:
        allow_population_by_field_name = True
        extra = Extra.allow

我在 JSON 下面传递:

   {
    "name": "Name",
    "address": "bla bla",
    "post": "post"
   }

我需要来自pydantic 的函数,如果可用,它将返回所有传递的额外字段。 喜欢:{"address", "post"}

【问题讨论】:

    标签: python python-3.x pydantic


    【解决方案1】:

    据我所知,没有现成的解决方案。但是,由于您可以访问 pre root validator 中的所有“原始”传递数据,包括额外的字段,因此您可以将它们放在单独的字典中。

    一个例子取自here。 感谢@PrettyWood 提供:

    from typing import Any, Dict, Optional
    
    from pydantic import BaseModel, Field, root_validator
    
    
    class ComposeProject(BaseModel):
        versio: Optional[str] = Field(alias='version')  # just to show that it supports alias too
        extra: Dict[str, Any]
    
        @root_validator(pre=True)
        def build_extra(cls, values: Dict[str, Any]) -> Dict[str, Any]:
            all_required_field_names = {field.alias for field in cls.__fields__.values() if field.alias != 'extra'}  # to support alias
    
            extra: Dict[str, Any] = {}
            for field_name in list(values):
                if field_name not in all_required_field_names:
                    extra[field_name] = values.pop(field_name)
            values['extra'] = extra
            return values
    
    
    project = ComposeProject(**{
      "version": "3",
      "services": ...
    })
    print(project.versio)  # => '3'
    print(project.extra)  # => {'services': Ellipsis}
    

    【讨论】:

    • 非常感谢@alex_noname ,您能否也看看这个:stackoverflow.com/questions/69617702/… 这对我来说是主要问题。谢谢。
    • 至于您的其他问题,您可以在将字段保存到额外的字典之前调用camelcasefield_name,但我恐怕没有直接的方法将额外的字段放在同一级别导出模型字典中声明的字段。
    猜你喜欢
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多