标签: pydantic

Pydantic:根据需要指定值但输入示例值

我在 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.x pydantic fastapi

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

如何在 Pydantic 中声明静态方法/类方法返回相关类的实例?

我正在使用 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 就不会抱怨?

python python-3.x flake8 python-typing pydantic

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

更改另一个字段时如何修改pydantic字段?

我有一个 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!!

python validation decorator pydantic fastapi

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

Pydantic 字段 JSON 别名根本不起作用

我需要为 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"}

这是真的吗?这样一个简单的用例怎么可能不起作用?

python pydantic fastapi

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

覆盖 Pydantic 中子类的字段别名

我有 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)

我怎样才能做到这一点?

python pydantic

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

FastApi:422 无法处理的实体

我在尝试接受迂腐模型时遇到此错误。经过一段时间的调试后,我相信问题出在接受上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)

python http-status-code-422 pydantic fastapi

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

Pydantic如何创建具有必填字段和动态字段的模型?

我有一个动态 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)

谢谢。

python pydantic

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

pydantic:如何选择字段的类型?

我有一个 FastAPI 应用程序,我需要创建一个 Car 类,其中属性Wheelspeed可以采用 intstr 类型。怎么做?此代码不起作用,因为Wheelspeed将只有整数类型(第二次打印中不是 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)

python python-3.x pydantic fastapi

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

在 pydantic 模型中单独指定嵌套字典字段

是否可以指定 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)

python pydantic

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

FastApi pydantic 如何验证电子邮件

我正在使用 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它,但它已被弃用。

python pydantic fastapi

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