标签: pydantic

TypedDict 不允许可选键?

我想使用 pydantic 进行模式验证,并使用 TypedDict 来定义嵌套字典模式的一部分。但是,我意识到Optional如果在 TypedDict 类中指定它则不起作用。

我读到这个类将根据需要呈现所有键,并且使所有键都成为可选的方法是 at total=False。但是,我只希望其中一个键是可选的,其余键是必需的。有没有办法克服这个限制?

from typing import List, Optional
from pydantic import BaseModel
from typing_extensions import TypedDict

class _trending(TypedDict):
    allStores: Optional[bool] = False
    category: str
    date: str
    average: List[int]

class RequestSchema(BaseModel):
    storeId: str
    trending: _trending
Run Code Online (Sandbox Code Playgroud)

编辑

我之前尝试过这个,因为我认为它类似于嵌套列表。

from typing import List, Optional, Dict
from pydantic import BaseModel


class _trending(BaseModel):
    allStores: Optional[bool] = False
    category: str
    date: str
    average: List[int]

class RequestSchema(BaseModel):
    storeId: str
    trending: Dict[_trending]
Run Code Online (Sandbox Code Playgroud)

但遇到一条错误消息,指出 Dict 需要 2 个参数。显然 Dict …

python pydantic typeddict

44
推荐指数
2
解决办法
2万
查看次数

不通过别名分配 Pydantic 字段

如何在不使用别名的情况下创建 pydantic 对象?

from pydantic import BaseModel, Field

class Params(BaseModel):
    var_name: int = Field(alias='var_alias')

Params(var_alias=5) # works
Params(var_name=5) # does not work
Run Code Online (Sandbox Code Playgroud)

python pydantic

37
推荐指数
1
解决办法
1万
查看次数

从 json 初始化 pydantic 数据类

我正在将dataclasses项目中现有的转换为pydantic-dataclasses,我使用这些dataclasses来表示我需要编码和解析 json 的模型。

这是我当前方法的一个示例,该方法对于我的用例来说不够好,我有一个类A,我想将其转换为字典(稍后转换为 json)并从该字典中读取。但我能找到的将 json 解析回模型的唯一方法给了我底层BaseModel而不是dataclass.

请注意,我使用该asdict函数将 a 转换dataclass为 a dict,因为它是用来pydantic_encoder将 a 转换dataclass为 json 的,并使用pydantic_encoder文档建议的将 a 转换pydantic-dataclass为 json: https: //pydantic-docs.helpmanual.io/usage /数据类/

from dataclasses import asdict
from pydantic.dataclasses import dataclass
from pydantic import BaseModel

@dataclass
class A:
    x: str

a = A("string")
a_dict = asdict(a)
parsed_a = A.__pydantic_model__.parse_obj(a_dict)

print(f"type of a: {type(a)}")
print(f"type of parsed_a: …
Run Code Online (Sandbox Code Playgroud)

python python-dataclasses pydantic

34
推荐指数
4
解决办法
6万
查看次数

是否可以更改 pydantic 中的输出别名?

设置:

# Pydantic Models

class TMDB_Category(BaseModel):
    name: str = Field(alias="strCategory")
    description: str = Field(alias="strCategoryDescription")


class TMDB_GetCategoriesResponse(BaseModel):
    categories: list[TMDB_Category]


@router.get(path="category", response_model=TMDB_GetCategoriesResponse)
async def get_all_categories():
    async with httpx.AsyncClient() as client:
        response = await client.get(Endpoint.GET_CATEGORIES)
        return TMDB_GetCategoriesResponse.parse_obj(response.json())
Run Code Online (Sandbox Code Playgroud)

问题:
创建响应时使用别名,我想避免它。我只需要这个别名来正确映射传入数据,但在返回响应时,我想使用实际的字段名称。

实际响应:

{
  "categories": [
    {
      "strCategory": "Beef",
      "strCategoryDescription": "Beef is ..."
    },
    {
      "strCategory": "Chicken",
      "strCategoryDescription": "Chicken is ..."
    }
}
Run Code Online (Sandbox Code Playgroud)

预期回应:

{
  "categories": [
    {
      "name": "Beef",
      "description": "Beef is ..."
    },
    {
      "name": "Chicken",
      "description": "Chicken is ..."
    }
}
Run Code Online (Sandbox Code Playgroud)

python json json-deserialization pydantic fastapi

34
推荐指数
3
解决办法
6万
查看次数

“pydantic\validators.py”:找不到 <class 'pandas.core.frame.DataFrame'> 的验证器

以下 pandas 的 DataFrame 未经过 pydantic 验证。这要怎么处理呢?

from pydantic.dataclasses import dataclass

@dataclass
class DataFrames:
    dataframe1: pd.DataFrame = None
    dataframe2: pd.DataFrame = None
Run Code Online (Sandbox Code Playgroud)

这会引发以下错误:

File "pydantic\validators.py", line 715, in find_validators

RuntimeError: no validator found for <class 'pandas.core.frame.DataFrame'>, see `arbitrary_types_allowed` in Config
Run Code Online (Sandbox Code Playgroud)

validation customvalidator pandas python-dataclasses pydantic

32
推荐指数
3
解决办法
5万
查看次数

FastAPI - GET 请求导致类型错误(值不是有效的字典)

这是我的数据库架构。

\n

在此输入图像描述

\n

我这样定义我的架构:

\n

从 pydantic 导入 BaseModel

\n
class Userattribute(BaseModel):\n    name: str\n    value: str\n    user_id: str\n    id: str\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的模型:

\n
class Userattribute(Base):\n    __tablename__ = "user_attribute"\n\n    name = Column(String)\n    value = Column(String)\n    user_id = Column(String)\n    id = Column(String, primary_key=True, index=True)\n
Run Code Online (Sandbox Code Playgroud)\n

在 crud.py 中我定义了一个get_attributes方法。

\n
def get_attributes(db: Session, skip: int = 0, limit: int = 100):\n    return db.query(models.Userattribute).offset(skip).limit(limit).all()\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的GET终点:

\n
@app.get("/attributes/", response_model=List[schemas.Userattribute])\ndef read_attributes(skip: int = 0, limit: int = 100, db: Session = …
Run Code Online (Sandbox Code Playgroud)

python get pydantic fastapi

32
推荐指数
1
解决办法
5万
查看次数

获取 pydantic 类的所有字段名称的简短方法

该类的最小示例:

from pydantic import BaseModel

class AdaptedModel(BaseModel):
    def get_all_fields(self, alias=False):
        return list(self.schema(by_alias=alias).get("properties").keys())

class TestClass(AdaptedModel):
    test: str
Run Code Online (Sandbox Code Playgroud)

它的工作原理:

dm.TestClass.get_all_fields(dm.TestClass)
Run Code Online (Sandbox Code Playgroud)

有没有办法让它发挥作用而不需要再次上课?

获取所有字段名称所需的方式:

dm.TestClass.get_all_fields()
Run Code Online (Sandbox Code Playgroud)

如果将字段名称分配给属性,它也会起作用。只要有办法让它更具可读性

python oop pydantic

31
推荐指数
2
解决办法
4万
查看次数

如何更改 pydantic 中的日期格式

如何更改 pydantic 中的日期格式以进行验证和序列化?为了验证我正在使用@validator. 这两种情况都有解决办法吗?

python python-3.x pydantic

29
推荐指数
4
解决办法
7万
查看次数

Pydantic 验证模式中未定义的额外字段

我正在使用 pydantic 进行架构验证,当任何额外字段添加到未定义的架构中时,我想抛出错误。

from typing import Literal, Union

from pydantic import BaseModel, Field, ValidationError


class Cat(BaseModel):
    pet_type: Literal['cat']
    meows: int


class Dog(BaseModel):
    pet_type: Literal['dog']
    barks: float


class Lizard(BaseModel):
    pet_type: Literal['reptile', 'lizard']
    scales: bool


class Model(BaseModel):
    pet: Union[Cat, Dog, Lizard] = Field(..., discriminator='pet_type')
    n: int


print(Model(pet={'pet_type': 'dog', 'barks': 3.14, 'eats': 'biscuit'}, n=1))
""" try:
    Model(pet={'pet_type': 'dog'}, n=1)
except ValidationError as e:
    print(e) """

Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我添加了eats未定义的字段。应用 pydantic 验证并删除我定义的额外值作为响应。我想抛出一个错误eats is not allowed for Dog或类似的东西。有什么办法可以实现这一点吗?

我们是否有机会直接提供输入而不是对象pet
print(Model({'pet_type': 'dog', 'barks': …

python validation pydantic

29
推荐指数
2
解决办法
4万
查看次数

我可以从 Pydantic 获取传入的额外字段吗?

我在 Pydantic Config 中定义了 pydantic 架构extra = Extra.allow

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

例如:

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

    class Config:
        allow_population_by_field_name = True
        extra = Extra.allow
Run Code Online (Sandbox Code Playgroud)

我传递以下 JSON:

   {
    "name": "Name",
    "address": "bla bla",
    "post": "post"
   }
Run Code Online (Sandbox Code Playgroud)

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

python python-3.x pydantic

28
推荐指数
3
解决办法
3万
查看次数