我将 FastAPI 与 SQLModel 结合使用,它基于 pydantic、SQLAlchemy 和类型提示。我正在尝试创建一个BitInteger(int64就足够了)专栏。我怎么做?
我的 sql 模型声明看起来像这样
class ItemBase(sqlmodel.SQLModel):
name: str
price: int
class Item(ItemBase, table=True):
id: int = sqlmodel.Field(default=None, primary_key=True)
class ItemCreate(ItemBase):
pass
Run Code Online (Sandbox Code Playgroud)
提前致谢!
在我的 Fast API 应用程序中,我有这个 pydantic 模型
class UserInArticleView(BaseModel):
"""What fields will be in nested sent_to_user list."""
telegram_id: int
class Config:
"""Enable ORM mode."""
orm_mode = True
class ArticleBase(BaseModel):
id: int
text: str = Field(..., min_length=50, max_length=1024)
image_url: HttpUrl = Field(..., title="Image URL")
language_code: str = Field("ru", max_length=3, min_length=2)
sent_to_user: List[UserInArticleView] = []
class Config:
orm_mode = True
Run Code Online (Sandbox Code Playgroud)
响应是
[
{
"id": 1,
"text": "Some text",
"image_url": "http://test.tt/",
"language_code": "ru",
"sent_to_user": [
{
"telegram_id": 444444444
},
{
"telegram_id": 111111111
}
] …Run Code Online (Sandbox Code Playgroud) 有没有办法在 pydantic 中本地检查输入变量的数据类型,例如:
class ModelParameters(BaseModel):
str_val: str
int_val: int
wrong_val: int
test = ModelParameters(**dict({
"str_val":"test",
"int_val":1,
"wrong_val":1.2}))
Run Code Online (Sandbox Code Playgroud)
这应该会引发错误wrong_val。
我有一个 json 键,其中有空格:
My_dict = {"my key": 1}
Run Code Online (Sandbox Code Playgroud)
我想创建一个Model来建模它:
from pydantic import BaseModel
class MyModel(BaseModel):
mykey: int
# my key isn't a legit variable name
# my_key is, but like mykey - it doesn't catch the correct key from the json
MyModel(**my_dict)
Run Code Online (Sandbox Code Playgroud)
这是行不通的。
我尝试玩BaseModel.Config,但没有取得任何进展。也没有在文档中看到任何内容。
这可能吗?
我可以使用解决方法:遍历json,将所有键的空格替换为下划线,然后使用,pydantic但我不想使用这个...
我有一个例子,我有一个 .env 文件,其中包含两个变量:
PROJECT_NAME="dummy"
DB_URL=postgresql+psycopg2://postgres:postgres@postgres:5432/
Run Code Online (Sandbox Code Playgroud)
在我的 config.py 中
class DummyConfig(BaseSettings):
PROJECT: str = Field(...)
DB_URL: str = Field(...)
Run Code Online (Sandbox Code Playgroud)
现在,根据我将运行的项目,PROJECT 变量将发生变化。我想通过连接 PROJECT + DB_URL 创建完整的数据库 url,并且这需要是配置类中的新变量(或在 DB_URL 中)。所以在这个例子中结果将是:
postgresql+psycopg2://postgres:postgres@postgres:5432/dummy
Run Code Online (Sandbox Code Playgroud)
在 Config 类中我想要这样的东西:
class DummyConfig(BaseSettings):
PROJECT: str = Field(...)
DB_URL: str = Field(...) + PROJECT #this is for illustration purpose, I know it does not work
Run Code Online (Sandbox Code Playgroud)
我研究了这篇文章:Pydantic:如何使用一个字段的值来设置其他字段的值?
但我不明白(因为分数低我也不能提问)如何做到这一点。OP正在使用user_dict,我认为它是在代码中的某个地方实例化的。我没有任何字典,我专门通过 .env 文件加载变量。
我已经定义了以下 pydantic 模型。当我运行时p = IntOrStr(value=True),我预计会失败,因为它是布尔值,并且True它应该使分配失败__int__str
class IntOrStr(BaseModel):
__int: Optional[conint(strict=True, le=100, ge=10)] = None
__str: Optional[constr(strict=True, max_length=64, min_length=10)] = None
value: Any
@validator("value")
def value_must_be_int_or_str(cls, v):
try:
__int = v # no validation. not sure why?
return v
except ValidationError as e:
print(str(e))
try:
__str = v # no validation. not sure why?
return v
except ValidationError as e:
print(str(e))
raise ValueError("error. value must be int or str")
class Config:
validate_assignment = True
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么__int …
我尝试从 API 接受数据,然后使用 Pydantic 基础模型验证响应结构。但是,我遇到的情况是,有时某些字段不会包含在响应中,而有时会包含在响应中。问题是,当我尝试验证结构时,Pydantic 开始抱怨这些字段“丢失”,尽管它们有时可能会丢失。我真的不明白如何将一个字段定义为“missible”。文档提到仅定义为名称和类型的字段被认为是这种方式,但我没有任何运气
这是我想要实现的目标的一个简单示例
# Response: {a: 1, b: "abc", c: ["a", "b", "c"]}
response: dict = json.loads(request_response)
# Pydantic Base Model
from pydantic import BaseModel
class Model(BaseModel):
a: int
b: str
c: List[str]
d: float
# Validating
Model(**response)
# Return: ValidationError - Missing "d" field
Run Code Online (Sandbox Code Playgroud)
如何使“d”不会导致验证抛出错误?我尝试将“d”切换为d: Optional[float]和d: Optional[float] = 0.0,但没有任何作用。
谢谢!
谁能解释一下 Pydantic 如何管理带下划线的属性名称?
在 Pydantic 模型中,使用下划线时会出现与属性命名相关的奇怪行为。这种行为不会发生在 python 类中。测试结果显示出一些据称“意外”的错误。
以下代码捕获简单类和实例操作的一些错误:
class PydanticClass(BaseModel):
a: int = "AAA"
_z: int = "_Z_Z_Z"
@classmethod
def get_a(cls):
return cls.a
@classmethod
def get_z(cls):
return cls._z
class NonPydanticClass:
a: int = "AAA"
_z: int = "_Z_Z_Z"
@classmethod
def get_a(cls):
return cls.a
@classmethod
def get_z(cls):
return cls._z
print ("PYDANTIC MODEL CLASS TEST:")
pydantic_instance = PydanticClass()
try: msg1, msg2 = "SUCCESS", f"{pydantic_instance.get_a()}"
except Exception as e: msg1, msg2 = "ERROR", f"{e}"
print('{0:<7} :: {1:<27} :: {2:<65} :: {3}'.format(msg1, "1 …Run Code Online (Sandbox Code Playgroud) 我有一个简单的应用程序如下:
from typing import Annotated
import uvicorn
from fastapi import FastAPI, Query, Depends
from pydantic import BaseModel
app = FastAPI()
class Input(BaseModel):
a: Annotated[str, Query(..., alias="your_name")]
@app.get("/")
def test(inp: Annotated[Input, Depends()]):
return f"Hello {inp.a}"
def main():
uvicorn.run("run:app", host="0.0.0.0", reload=True, port=8001)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
curl "http://127.0.0.1:8001/?your_name=amin"返回“你好阿明”
我现在将别名从 更改your_name为your-name。
from typing import Annotated
import uvicorn
from fastapi import FastAPI, Query, Depends
from pydantic import BaseModel
app = FastAPI()
class Input(BaseModel):
a: Annotated[str, Query(..., alias="your-name")] …Run Code Online (Sandbox Code Playgroud) 如何在FastAPI中将字符串转换为模型类型?如果我有学生模型并且想要将字符串学生转换为类型模型。如何转换呢?
engine = create_engine(SQLALCHAMY_DATABASE_URL,pool_pre_ping=True,pool_recycle=3600)
meta = MetaData()
con = engine.connect()
SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)
Base = declarative_base()
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
def convert_model(student,db:Session = Depends(database.get_db)):
Q=student.all()
convert_model(student,db)
Run Code Online (Sandbox Code Playgroud)
它给出了错误str object has no attribute all()
pydantic ×10
python ×10
fastapi ×4
sqlalchemy ×2
json ×1
query-string ×1
sqlmodel ×1
typing ×1
validation ×1