标签: pydantic

如何在 Pydantic 中创建多个约束类型

我试图对秘密字符串施加限制。例如,如果可以的话,我想要这样的东西:

from pydantic import constr, SecretStr

class SimpleModel(BaseModel):
    password: (SecretStr, constr(min_length=8, max_length=32))
Run Code Online (Sandbox Code Playgroud)

如果可以做一些事情来实现这一点,我的下一个问题将是:我还可以添加一个需要非单词字符的约束吗?我可以自己进行正则表达式检查,但我正在尝试pydantic更全面地采用。

python pydantic

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

Cloud Run 请求在未到达已部署服务的情况下触发错误 400

我目前正在使用Google Cloud Run部署 API,尽管一切正常,但我现在很难理解我收到的错误。

\n

我使用FastAPI在 python3 上创建了 API ,位置模型基于Pydantic\'s BaseModel。

\n

为了说明这一点,我定义了一条测试路线,如下所示:

\n
class Location(BaseModel):\n    lat: float\n    lng: float\n\n\n@router.get(\'/test_404\')\nasync def test_404(origin: Location = Body(...),\n                   destination: Location = Body(...)):\n    print(origin)\n    print(destination)\n    return {\'res\': \'ok\'}\n
Run Code Online (Sandbox Code Playgroud)\n

该路由应在请求正文中采用两个参数:起点和目的地,并且只有当我在本地部署它时才会这样做。\n这:

\n
url_local = "http://0.0.0.0:8080/test_404"\ndata = {\n    \'origin\': {\'lat\': 104, \'lng\': 342},\n    \'destination\': {\'lat\': 104, \'lng\': 342}\n}\nresp = requests.get(url_local, json = data)\nprint(resp.text)\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
\'{"res":"ok"}\'\n
Run Code Online (Sandbox Code Playgroud)\n

当我在 Cloud Run 上部署相同的服务时,就会出现问题。我的所有其他路线都工作正常,但以下是当我将上面的代码与容器 url 一起使用时得到的输出:

\n
    <!DOCTYPE html>\\n\n    <html lang=en>\n    <meta charset=utf-8>\n …
Run Code Online (Sandbox Code Playgroud)

python-3.x google-cloud-platform pydantic google-cloud-run fastapi

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

是否可以使用 Pydantic BaseModel orm_mode 从 gui 类获取数据

是否可以使用从 Pydantic.BaseModel 继承的模型类通过设置 orm_mode= true 来从 GUI 类获取数据,就像与数据库一起使用一样

from typing import List
from sqlalchemy import Column, Integer, String
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.ext.declarative import declarative_base
from pydantic import BaseModel, constr

Base = declarative_base()


class CompanyOrm(Base):
    __tablename__ = 'companies'
    id = Column(Integer, primary_key=True, nullable=False)
    public_key = Column(String(20), index=True, nullable=False, unique=True)
    name = Column(String(63), unique=True)
    domains = Column(ARRAY(String(255)))


class CompanyModel(BaseModel):
    id: int
    public_key: constr(max_length=20)
    name: constr(max_length=63)
    domains: List[constr(max_length=255)]

    class Config:
        orm_mode = True
Run Code Online (Sandbox Code Playgroud)

''''如果可以的话我该怎么做?

python pydantic

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

无法在 pydantic init 函数中定义变量

我想定义一个继承自 pydantic BaseModel 的基本模型,如下所示

class BaseDomain(BaseModel):

    def __init__(self, **kwargs):
        self.__exceptions = []

    def add_error(self, exception: GeneralException):
        self.__exceptions.append(exception)

Run Code Online (Sandbox Code Playgroud)

但是当我使用继承自 BaseDomain 的产品模型时出现此错误

ValueError: "Product" object has no field "_BaseDomain__exceptions"
Run Code Online (Sandbox Code Playgroud)

python model python-3.x pydantic

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

检查 JSON 字符串是否是有效的 Pydantic 架构

我想检查 JSON 字符串是否是有效的 Pydantic 架构。

from pydantic import BaseModel

class MySchema(BaseModel):
    val: int
Run Code Online (Sandbox Code Playgroud)

我可以通过 try/ except 非常简单地做到这一点:

import json

valid = '{"val": 1}'
invalid = '{"val": "horse"}'

def check_valid(item):
    try:
        MySchema(**json.loads(item))
        return True
    except:
        return False

print(check_valid(valid))
print(check_valid(invalid))
Run Code Online (Sandbox Code Playgroud)

输出:

True
False
Run Code Online (Sandbox Code Playgroud)

使用 try/ except 来获得真/假似乎是不好的做法。有没有更好的办法?

python validation pydantic

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

使用 Pydantic 模型的 FastAPI 查询参数

我有一个 Pydantic 模型如下

class Student(BaseModel):
    name:str
    age:int
Run Code Online (Sandbox Code Playgroud)

通过此设置,我希望获得如下 OpenAPI 架构:

在此输入图像描述

那么,如何使用 Pydantic 模型来获取 FastAPI 中的 from 查询参数呢?

python pydantic fastapi

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

如何在模型中引发 HTTP 400?

我的路线:

@router.get('/check/{value}', status_code=200)
def ranks_check(value: BasicInput = Depends()):
    """
    Test endpoint
    """

    return value
Run Code Online (Sandbox Code Playgroud)

我的型号:

class BasicInput:
    """
    Get Confidence to score Input class
    """

    value: int

    @validator('value')
    def check_if_value_in_range(cls, v):
        if not 0 < v < 1000001:
            raise ValueError('Value Exceeded Limit')
Run Code Online (Sandbox Code Playgroud)

我需要做什么:

我需要验证输入并在出现 ValueError 时引发 HTTP 400。

我知道我可以使用 Pydantic 的类型完成整数验证,并在路由函数本身中Field进行运行。check_if_value_in_range我正在寻找使用该模型的解决方案。

python python-3.x pydantic fastapi

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

无法通过 SQLModel 将 FastAPI List[]、Set() 映射到 Postgres

我正在使用FastAPI制作我的个人投资组合 API ,并决定尝试SQLModel。它感觉非常直观,到目前为止我很喜欢它,但我遇到了一个问题,我已经挣扎了好几天,试图了解如何解决它。

\n

我有一个项目模型:

\n
from datetime import datetime\nfrom typing import List, Optional, Set\nfrom sqlmodel import SQLModel, Field\n\n\nclass ProjectBase(SQLModel):\n    name: Optional[str]\n    summary: Optional[str]\n    description: Optional[str]\n    category: Set[str] = ()\n    award: Optional[str] = None\n    url: Optional[str] = None\n    published: datetime = datetime.utcnow()\n    image: str = "placeholderMainImage"\n    images: List[str] = []\n    learning: Optional[str]\n    tech: Optional[str]\n    tools: Optional[str]\n\n\n\nclass Project(ProjectBase, table=True):\n    id: int = Field(default=None, primary_key=True)\n    created_at: datetime = Field(default_factory=datetime.utcnow)\n    updated_at: datetime = Field(default_factory=datetime.utcnow)\n
Run Code Online (Sandbox Code Playgroud)\n

FastAPI 工作正常,我检查了 localhost:8000/docs并正确进行了类型验证: …

sqlalchemy pydantic fastapi sqlmodel

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

将json导入到pydantic模型,更改字段名称

我有来自外部系统的 json,其中包含“system-ip”、“domain-id”等字段。这些名称在Python中是不允许的,所以我想将它们更改为“system_ip”,“domain_id”等。我在stackoverflow上阅读了所有带有“pydantic”w关键字的内容,我尝试了pydantic文档中的示例,作为最后的手段,我生成了json来自我的 json 的架构,然后使用

datamodel-codegen --input device_schema.json --output model.py

我生成了模型。

生成的模型具有如下字段

    system_ip: str = Field(..., alias='system-ip')
    host_name: str = Field(..., alias='host-name')
    device_type: str = Field(..., alias='device-type')
    device_groups: List[str] = Field(..., alias='device-groups')
Run Code Online (Sandbox Code Playgroud)

但它仍然不起作用。当我做

with open("device.json") as file:
    raw_device = json.load(file)
d = PydanticDevice(**raw_device)
Run Code Online (Sandbox Code Playgroud)

pydantic 仍然看到“旧”字段名称,而不是带注释的字段名称,并且我有错误

TypeError: __init__() got an unexpected keyword argument 'system-ip'
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

python json pydantic

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

每次初始化对象时,生成一个唯一值并将其应用到 pydantic 模型中的字段

我正在使用 pydantic 制作一个模型,我想声明一个字段,每次创建对象时都会生成一个随机值(如 id)。我不想在初始化对象时必须传递该字段的值,这是我想要使用 python 类方法的快速示例:

from uuid import uuid4

class User:
    def __init__(self, name, last_name, email):
        self.name = name
        self.last_name = last_name
        self.email = email
        self.id = uuid4()
Run Code Online (Sandbox Code Playgroud)

我尝试用 pydantic 做到这一点:

from pydantic import BaseModel, EmailStr
from uuid import UUID, uuid4


class User(BaseModel):
    name: str
    last_name: str
    email: EmailStr
    id: UUID = uuid4()
Run Code Online (Sandbox Code Playgroud)

但是,使用此模型创建的所有对象都具有相同的 uuid,所以我的问题是,当使用 pydantic 创建对象时如何生成唯一值(在本例中为 id 字段)。谢谢 !

python pydantic

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