标签: pydantic

mypy 如何接受 pydantic 的 constr() 类型?

我有这个代码:

from pydantic import BaseModel, constr

DeptNumber = constr(min_length=6, max_length=6)

class MyStuff(BaseModel):
    dept: DeptNumber

ms = MyStuff(dept = "123456")
Run Code Online (Sandbox Code Playgroud)

deptnr.py:6:错误:变量“deptnr.DeptNumber”作为类型无效
deptnr.py:6:注意:请参阅https://mypy.readthedocs.io/en/latest/common_issues.html#variables-vs -类型别名

提供的链接似乎并没有真正解决我的问题(我没有使用Type)。

不管有没有这个都会发生这种情况mypy.ini

[mypy]
plugins = pydantic.mypy

[pydantic-mypy]
init_typed = true
Run Code Online (Sandbox Code Playgroud)

最初我在 Pydantic 中也遇到了choice如下错误,但我通过使用 Python 解决了这个问题Literal

DIR = choice(["North", "East", "South", "West"])
Run Code Online (Sandbox Code Playgroud)

我需要改变什么才能让 mypy 对 Pydantic 感到满意constr

python mypy pydantic

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

Pydantic constr 与 Field args

我想知道以下之间有什么区别:

from pydantic import BaseModel, Field

class Person(BaseModel):
    name: str = Field(..., min_length=1)
Run Code Online (Sandbox Code Playgroud)

和:

from pydantic import BaseModel, constr

class Person(BaseModel):
    name: constr(min_length=1)
Run Code Online (Sandbox Code Playgroud)

name两者似乎都执行相同的验证(甚至在为空字符串时引发完全相同的异常信息)。这只是代码风格的问题吗?其中一个比另一个更受青睐吗?

另外,如果我想包含一个非空字符串列表作为属性,您认为以下哪种方式更好?:

from typing import List
from pydantic import BaseModel, constr

class Person(BaseModel):
    languages: List[constr(min_length=1)]
Run Code Online (Sandbox Code Playgroud)

或者:

from typing import List    
from pydantic import BaseModel, Field

class Person(BaseModel):
    languages: List[str]
    
    @validator('languages', each_item=True)
    def check_nonempty_strings(cls, v):
        if not v:
            raise ValueError('Empty string is not a valid language.')
        return v
Run Code Online (Sandbox Code Playgroud)

编辑:FWIW,我将其用于 FastAPI 应用程序。

编辑2:对于我的第二个问题,我认为第一个替代方案更好,因为它包含架构中的长度要求(因此它在文档中)

python validation typing pydantic fastapi

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

在 FastAPI 中测试 Pydantic 设置

假设我的main.py是这样的(这是一个简化的示例,在我的应用程序中我使用实际的数据库,并且有两个不同的数据库 URI 用于开发和测试):

from fastapi import FastAPI
from pydantic import BaseSettings

app = FastAPI()

class Settings(BaseSettings):
    ENVIRONMENT: str

    class Config:
        env_file = ".env"
        case_sensitive = True

settings = Settings()

databases = {
    "dev": "Development",
    "test": "Testing"
}
database = databases[settings.ENVIRONMENT]

@app.get("/")
def read_root():
    return {"Environment": database}
Run Code Online (Sandbox Code Playgroud)

而这.env

ENVIRONMENT=dev
Run Code Online (Sandbox Code Playgroud)

假设我想测试我的代码并且我想设置ENVIRONMENT=test为使用测试数据库。我应该怎么办?在FastAPI文档(https://fastapi.tiangolo.com/advanced/settings/#settings-and-testing)中有一个很好的例子,但它是关于依赖关系的,所以据我所知这是一个不同的情况。

我的想法如下(test.py):

ENVIRONMENT=dev
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

此外,我收到此错误:

ScopeMismatch: You tried to access the 'function' scoped fixture 'monkeypatch' with a 'session' scoped request object, involved …
Run Code Online (Sandbox Code Playgroud)

python testing pydantic fastapi

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

使用 FastAPI 和 Pydantic,如何定义带有描述的可选字段

对于 FastAPI Pydanctic 类,我有这些值

class ErrorReportRequest(BaseModel):
    sender: Optional[str] = Field(..., description="Who sends the error message.")
    error_message_displayed_to_client: str = Field(..., description="The error message displayed to the client.")
Run Code Online (Sandbox Code Playgroud)

我使用该类作为输入模型

router = APIRouter()

@router.post(
    "/error_report",
    response_model=None,
    include_in_schema=True,

)
def error_report(err: ErrorReportRequest):
    pass
Run Code Online (Sandbox Code Playgroud)

当我运行它时,sender是必填字段。如果它未包含在传入的 JSON 中,我会收到验证错误。

输入:

{
  "error_message_displayed_to_client": "string"
}
Run Code Online (Sandbox Code Playgroud)

结果是:

{
  "detail": [
    {
      "loc": [
        "body",
        "sender"
      ],
      "msg": "field required",
      "type": "value_error.missing"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如果我像这样删除字段描述:

    class ErrorReportRequest(BaseModel):
        sender: Optional[str]
        error_message_displayed_to_client: str = Field(..., description="The error message displayed …
Run Code Online (Sandbox Code Playgroud)

pydantic fastapi

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

在 Pydantic 中定义递归模型?

如何定义递归 Pydantic 模型?

这是我的意思的一个例子:

from typing import List
from pydantic import BaseModel

class Task(BaseModel):
    name: str
    subtasks: List[Task] = []
Run Code Online (Sandbox Code Playgroud)

但是当我运行时出现以下错误:

NameError                                 Traceback (most recent call last)
<ipython-input-1-c6dca1d390fe> in <module>
      2 from pydantic import BaseModel
      3
----> 4 class Task(BaseModel):
      5     name: str
      6     subtasks: List[Task] = []

<ipython-input-1-c6dca1d390fe> in Task()
      4 class Task(BaseModel):
      5     name: str
----> 6     subtasks: List[Task] = []
      7

NameError: name 'Task' is not defined
Run Code Online (Sandbox Code Playgroud)

我查看了文档但找不到任何内容。例如,在“递归模型”页面上,但它似乎是关于嵌套子类型而BaseModel不是关于递归类型定义。

感谢您的帮助!

python oop types jsonschema pydantic

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

如何让Alembic识别SQLModel数据库模型?

使用SQLModel如何让 alembic 识别以下模型?

from sqlmodel import Field, SQLModel

class Hero(SQLModel, table=True):
    id: int = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: Optional[int] = None
Run Code Online (Sandbox Code Playgroud)

我一直在研究的一种方法是导入 Alembic 的 SQLalchemy 模型,但查看源代码我找不到如何做到这一点。

如何使 Alembic 与 SQLModel 模型一起使用?

sqlalchemy alembic pydantic fastapi sqlmodel

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

FastAPI 显示“msg”:“必填字段”,“类型”:“value_error.missing”

各位晚上好。我正在尝试使用 FastAPI 请求将新用户添加到我的数据库中。当我尝试通过 python 控制台应用程序执行此操作时,FastAPI 向我显示以下消息:

{
     'detail': [
         {
             'loc': ['body', 'nickname'],
             'msg': 'field required',
             'type': 'value_error.missing'
         },
         {
             'loc': ['body', 'password'],
             'msg': 'field required',
             'type': 'value_error.missing'
         },
         {
             'loc': ['body', 'email'],
             'msg': 'field required',
             'type': 'value_error.missing'
         }
    ]
}
Run Code Online (Sandbox Code Playgroud)

但是,当我执行此请求时,/docs一切正常!

这是我的 pydantic 模型:

{
     'detail': [
         {
             'loc': ['body', 'nickname'],
             'msg': 'field required',
             'type': 'value_error.missing'
         },
         {
             'loc': ['body', 'password'],
             'msg': 'field required',
             'type': 'value_error.missing'
         },
         {
             'loc': ['body', 'email'],
             'msg': 'field required',
             'type': 'value_error.missing'
         } …
Run Code Online (Sandbox Code Playgroud)

python pydantic fastapi

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

为什么在继承 Pydantic BaseModel 时会出现“AttributeError: __fields_set__”?

我有这个项目,我的基类和我的子类实现pydantic.BaseModel

from pydantic import BaseModel
from typing import List
from dataclasses import dataclass

@dataclass
class User(BaseModel):
    id: int 

@dataclass
class FavoriteCar(User):
    car_names: List[str] 

car = FavoriteCar(id=1, car_names=["Acura"])
print(f"{car.id} {car.car_names[0]}")
Run Code Online (Sandbox Code Playgroud)

但是出现这个错误:

from pydantic import BaseModel
from typing import List
from dataclasses import dataclass

@dataclass
class User(BaseModel):
    id: int 

@dataclass
class FavoriteCar(User):
    car_names: List[str] 

car = FavoriteCar(id=1, car_names=["Acura"])
print(f"{car.id} {car.car_names[0]}")
Run Code Online (Sandbox Code Playgroud)

有人介意解释发生了什么吗?我想使用 pydantic 的原因是因为我需要一种方法来快速将 Python 对象转换为dict(或 JSON)并返回。

python pydantic

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

FastAPI - Pydantic - 值错误引发内部服务器错误

我正在将 FastAPI 与 Pydantic 结合使用。

我的问题 - 我需要使用 Pydantic 引发 ValueError

from fastapi import FastAPI
from pydantic import BaseModel, validator
from fastapi import Depends, HTTPException

app = FastAPI()

class RankInput(BaseModel):

    rank: int

    @validator('rank')
    def check_if_value_in_range(cls, v):
        """
        check if input rank is within range
        """
        if not 0 < v < 1000001:

            raise ValueError("Rank Value Must be within range (0,1000000)")
            #raise HTTPException(status_code=400, detail="Rank Value Error") - this works But I am looking for a solution using ValueError
        return v

def …
Run Code Online (Sandbox Code Playgroud)

python python-3.x pydantic fastapi

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

有没有办法在 FastAPI/OpenAPI 中拥有多个响应模型?

我正在编写一个应用程序,我需要根据逻辑有两组完全不同的响应结构。

有什么方法可以处理这个问题,以便我可以序列化、验证和返回两个不同的响应模型并反映在 OpenAPI JSON 中?

我正在使用 pydantic 来编写模型。

openapi pydantic fastapi

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