我在 FastAPI 中使用 Pydantic,在 OpenAPI 文档中定义。意识到要根据需要定义值,我需要将值保留为空,如下所示。
class Item(BaseModel):
name: str
description: str
price: float
tax: float
Run Code Online (Sandbox Code Playgroud)
但是,我想提供带有示例值的 JSON,我可以使用以下语法创建它。
class Item(BaseModel):
name: str = "my name"
description: str = "my description"
price: float = 0.234
tax: float = 0.20
Run Code Online (Sandbox Code Playgroud)
但这将使它们成为 OpenAPI 文档中不需要的。有没有什么方法可以让我根据需要指定它们,并给出示例值?
我正在使用 Python 3.7 并有类似的东西
class A(object):
def __init__(self, value: int):
self.value = value
@classmethod
def factory(cls, value: int) -> A:
return A(value=value)
Run Code Online (Sandbox Code Playgroud)
是的,这是一个人为的示例,但我本质上是试图注释工厂函数以声明它返回 的实例,但是,当我尝试 在文件上A运行 linter 时,此操作会失败,因为它抱怨未定义。flake8A
有没有什么方法可以注释这个函数,这样 linter 就不会抱怨?
我有一个 pydantic 类,例如:
from pydantic import BaseModel
class Programmer(BaseModel):
python_skill: float
stackoverflow_skill: float
total_score: float = None
Run Code Online (Sandbox Code Playgroud)
现在我正在根据其他字段计算 total_score:
@validator("total_score", always=True)
def calculat_total_score(cls, v, *, values):
return values.get("python_skill") + values.get("stackoverflow_skill")
Run Code Online (Sandbox Code Playgroud)
这很好用,但是现在当我更改其中一项技能时:
programmer = Programmer(python_skill=1.0, stackoverflow_skill=9.0)
print(programmer.total_score) # return 10.0
programmer.python_skill=2.0
print(programmer.total_score) # still return 10.0
Run Code Online (Sandbox Code Playgroud)
我希望 total_score 自动更新。
任何解决方案?TNX!!
我需要为 Pydantic 对象指定一个 JSON 别名。它根本不起作用。
from pydantic import Field
from pydantic.main import BaseModel
class ComplexObject(BaseModel):
for0: str = Field(None, alias="for")
def create(x: int, y: int):
print("was here")
co = ComplexObject(for0=str(x * y))
return co
co = create(x=1, y=2)
print(co.json(by_alias=True))
Run Code Online (Sandbox Code Playgroud)
这个的输出是{"for" : null而不是{"for" : "2"}
这是真的吗?这样一个简单的用例怎么可能不起作用?
我有 2 个模型,其中 1 个是另一个的子类:
from pydantic import BaseModel
from typing import List
class Model1(BaseModel):
names: List[str]
class Model2(Model1):
# define here an alias for names -> e.g. "firstnames"
pass
data = { "names": ["rodrigo", "julien", "matthew", "bob"] }
# Model1(**data).dict() -> gives {'names': ['rodrigo', 'julien', 'matthew', 'bob']}
# Model2(**data).dict() -> gives {'firstnames': ['rodrigo', 'julien', 'matthew', 'bob']}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我在尝试接受迂腐模型时遇到此错误。经过一段时间的调试后,我相信问题出在接受上CodeCreate
悬垂模型
class BaseCode(BaseModel):
index: Optional[int] = Field(None)
email: EmailStr
gen_time: datetime
expire_time: datetime
class CodeCreate(BaseCode):
code: int
used_time: Optional[datetime] = Field(None)
class Config:
orm_mode = True
class Message(BaseModel):
message: str
Run Code Online (Sandbox Code Playgroud)
代码 ORM
class Code(Base):
__tablename__ = 'code'
index = Column(Integer, primary_key=True, autoincrement=True)
code = Column(Integer)
email = Column(String, ForeignKey('user.email'))
gen_time = Column(DateTime)
expire_time = Column(DateTime)
used_time = Column(DateTime, nullable=True)
Run Code Online (Sandbox Code Playgroud)
处理程序
@app.post('/verify-code', response_model=schemas.Message, responses={404: {"model": schemas.Message}, 406: {"model": schemas.Message}})
async def verify_code(code: schemas.CodeCreate, response: Response, device_name: str = Body(..., …Run Code Online (Sandbox Code Playgroud) 我有一个动态 json,例如:
{
"ts": 1111111, // this field is required
... // others are dynamic
}
Run Code Online (Sandbox Code Playgroud)
除了 之外,这些字段都是动态的ts。例如:
{"ts":111,"f1":"aa","f2":"bb"}
Run Code Online (Sandbox Code Playgroud)
{"ts":222,"f3":"cc","f4":"dd"}
Run Code Online (Sandbox Code Playgroud)
如何用 Pydantic 声明这个模型?
class JsonData(BaseModel):
ts: int
... # and then?
Run Code Online (Sandbox Code Playgroud)
相当于打字稿:
interface JsonData {
ts: number;
[key: string]: any;
}
Run Code Online (Sandbox Code Playgroud)
谢谢。
我有一个 FastAPI 应用程序,我需要创建一个 Car 类,其中属性Wheel和speed可以采用 int或str 类型。怎么做?此代码不起作用,因为Wheel和speed将只有整数类型(第二次打印中不是 str ):
from pydantic import BaseModel
class Car(BaseModel):
wheel: int | str
speed: int | str
bmw = Car(wheel=4, speed=250)
mercedes = Car(wheel='4', speed='200')
print(type(bmw.wheel), type(bmw.speed))
print(type(mercedes.wheel), type(mercedes.speed))
Run Code Online (Sandbox Code Playgroud)
结果是:
<class 'int'> <class 'int'>
<class 'int'> <class 'int'>
Run Code Online (Sandbox Code Playgroud) 是否可以指定 pydantic 模型中包含的字典中的各个字段?我找不到任何东西,但也许我使用了错误的关键字。我在想这样的事情:
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str = 'Jane Doe'
stats = {
age: int,
height: float,
}
Run Code Online (Sandbox Code Playgroud)
编辑:经过一些反馈后,我觉得我需要澄清一些条件并给出一个更完整的示例。我想要做的与此更相似:
from pydantic import BaseModel, NonNegativeInt, NonNegativeFloat
from pydantic.generics import GenericModel
DataT = TypeVar('DataT')
class Trait(GenericModel, Generic[DataT]):
descript: str
value: DataT
class CharacterBarbarian(BaseModel):
id: int
name: str = 'Barbarok'
traits = {
strength: Trait[NonNegativeInt] = Trait[NonNegativeInt](descript='the force', value=18),
height: Trait[NonNegativeFloat] = Trait[NonNegativeFloat](descript='tallness', value=1.8),
weight: Trait[NonNegativeFloat] = Trait[NonNegativeFloat](descript='width', value=92.1),
}
class CharacterWizard(BaseModel):
id: int
name: str = …Run Code Online (Sandbox Code Playgroud) 我正在使用 pydantic 来验证我需要验证电子邮件的响应。我正在这样尝试。
class CheckLoginRequest(BaseModel):
user_email: str = Field(min_length=5, default="username")
user_number: str = Field(min_length=5, default="+923323789263")
@field_validator("user_email")
def validate_email(self, value):
try:
validate_email(value)
except EmailNotValidError:
raise ValueError("Invalid email format")
return value
Run Code Online (Sandbox Code Playgroud)
但它显示错误pydantic.errors.PydanticUserError: @field_validator cannot be applied to instance methods
我尝试使用@validator它,但它已被弃用。