我有这个代码:
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
?
我想知道以下之间有什么区别:
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:对于我的第二个问题,我认为第一个替代方案更好,因为它包含架构中的长度要求(因此它在文档中)
假设我的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) 对于 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 模型?
这是我的意思的一个例子:
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
不是关于递归类型定义。
感谢您的帮助!
使用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 模型一起使用?
各位晚上好。我正在尝试使用 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) 我有这个项目,我的基类和我的子类实现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)并返回。
我正在将 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) 我正在编写一个应用程序,我需要根据逻辑有两组完全不同的响应结构。
有什么方法可以处理这个问题,以便我可以序列化、验证和返回两个不同的响应模型并反映在 OpenAPI JSON 中?
我正在使用 pydantic 来编写模型。
pydantic ×10
fastapi ×7
python ×7
alembic ×1
jsonschema ×1
mypy ×1
oop ×1
openapi ×1
python-3.x ×1
sqlalchemy ×1
sqlmodel ×1
testing ×1
types ×1
typing ×1
validation ×1