我想使用 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 …
如何在不使用别名的情况下创建 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) 我正在将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) 设置:
# 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) 以下 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
这是我的数据库架构。
\n\n我这样定义我的架构:
\n从 pydantic 导入 BaseModel
\nclass Userattribute(BaseModel):\n name: str\n value: str\n user_id: str\n id: str\n
Run Code Online (Sandbox Code Playgroud)\n这是我的模型:
\nclass 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
方法。
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
终点:
@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) 该类的最小示例:
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)
如果将字段名称分配给属性,它也会起作用。只要有办法让它更具可读性
如何更改 pydantic 中的日期格式以进行验证和序列化?为了验证我正在使用@validator
. 这两种情况都有解决办法吗?
我正在使用 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': …
我在 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"}
pydantic ×10
python ×9
fastapi ×2
python-3.x ×2
validation ×2
get ×1
json ×1
oop ×1
pandas ×1
typeddict ×1