【问题标题】:issues with initializing tortoise orm with fastapi使用 fastapi 初始化乌龟 orm 的问题
【发布时间】:2021-06-18 20:12:34
【问题描述】:

我遇到了乌龟 orm 和 fastapi 的问题

我有来自app.py 的以下代码;为了简洁,我跳过了一些行

app.py

from fastapi import FastAPI, HTTPException
from app.models import User_Pydantic, UserIn_Pydantic, Users
from app.utils import cryptoUtil
from app.auth import auth as auth_router
from tortoise.contrib.fastapi import HTTPNotFoundError, register_tortoise


app = FastAPI()

@app.post("/users", response_model=User_Pydantic)
async def create_user(user: UserIn_Pydantic):
    user.password = cryptoUtil.hash_password(user.password)
    user_obj = Users(email=user.email, password=user.password, fullname=user.fullname, status=user.status)
    await user_obj.save()

    return await User_Pydantic.from_tortoise_orm(user_obj)




register_tortoise(
    app,
    db_url=config.DATABASE_URL,
    modules={"models": ["app.models"]},
    generate_schemas=True,
    add_exception_handlers=True,
)


app.include_router(auth_router.router, tags=["Auth"])

if __name__ == '__main__':
    app.run()

这很好用并且能够创建用户

但现在我正在尝试从另一个文件中做同样的事情

auth.py

from fastapi import APIRouter, Depends, HTTPException
from app.auth import crud
from app.utils import cryptoUtil
from app.models import User_Pydantic, UserIn_Pydantic, Users


router = APIRouter()


@router.post("/auth/register", response_model=User_Pydantic)
async def register(user: UserIn_Pydantic):
    result = await crud.find_exist_user(user.email)
    
    if result:
        raise HTTPException(status_code=404, detail="user already exists!")
    
    user.password = cryptoUtil.hash_password(user.password)
    user_obj = Users(email=user.email, password=user.password, fullname=user.fullname, status=user.status)
    await user_obj.save()

    return await User_Pydantic.from_tortoise_orm(user_obj)

但这不起作用,我在 404 错误响应中得到了这个

{
  "detail": "Object does not exist"
}

我认为问题在于from_tortoise_orm(user_obj) in

return await User_Pydantic.from_tortoise_orm(user_obj)

无法在auth.py 文件中工作,因为由于某种原因我无法在初始化乌龟的app.py 文件之外运行它

我该怎么做才能解决这个问题? 我遇到的部分问题是如何能够从外部app.py 调用乌龟初始化,其中register_tortoise 存在

更新:

文件夹结构

├── app
│   ├── app.py
│   ├── models.py
│   ├── config.py
│   │
│   ├── auth
│   │   ├── auth.py
│   │   ├── crud.py
│   │      
│   └── utils
│       ├── cryptoUtil.py
│       

【问题讨论】:

  • 如果您不显示文件夹结构,则假设所有内容都在同一个文件夹中(我猜不是)。另外,我认为您在 register_tortoise 之前缺少 Tortoise.init_models(models_list, "models")
  • 我添加了文件夹结构...我的代码中没有这个Tortoise.init_models(models_list, "models")...我在哪里添加这个?它有什么用?

标签: python fastapi tortoise-orm


【解决方案1】:

正如我在 cmets 中所说,您需要插入

Tortoise.init_models(models_list, "models")

在下一行之前

register_tortoise(
    app,
    db_url=config.DATABASE_URL,
    modules={"models": ["app.models"]},
    generate_schemas=True,
    add_exception_handlers=True,
)

当然,您必须根据您的配置更改“模型”文件夹和名称。

一开始对我来说也是个问题,但是下面的github问题解决了这个问题

https://github.com/tortoise/tortoise-orm/issues/444

文档也提供了解释

https://tortoise-orm.readthedocs.io/en/latest/search.html?q=early+init

更新

Tortoise.init_models(models_list, "models")

models_list 是要考虑的模型的路径列表(字符串)。在您的情况下,它将是 app.models。

这个想法是在连接到数据库之前初始化并开始准备模型。这是使关系在 pydantic 模型中可用所需的步骤。

这里是 API 文档

https://tortoise-orm.readthedocs.io/en/latest/setup.html?highlight=init#tortoise.Tortoise.init_models

【讨论】:

  • 你介意解释一下Tortoise.init_models(models_list, "models")这行的作用吗?当我将它添加到app.py 文件时,我也收到此错误,这是我收到的错误File "/usr/src/app/app/app.py", line 73, in <module> Tortoise.init_models(models_list, "models") NameError: name 'models_list' is not defined
  • 即使在阅读此tortoise-orm.readthedocs.io/en/latest/… 之后,我仍然不知道这两个参数是什么..第二个我认为它是模型文件的名称,所以对我来说它将是models 但第一个参数是个谜
  • 我更新了答案。以为你收到了通知
  • 没有收到通知...所以应该是这个? Tortoise.init_models(["app.models"], "models")
  • 是的。它初始化在通用名称“models”下在“app.models”中声明的 Tortoise 模型。然后,在初始化 Tortoise 时,orm 将使用这些模型。它应该可以工作,因为我还没有测试过你的代码,所以说起来并不容易
猜你喜欢
  • 2020-09-11
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 2017-08-09
  • 2021-12-17
  • 2021-11-22
  • 1970-01-01
  • 2021-07-12
相关资源
最近更新 更多