首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将umongo的对象文档模型从主web应用程序中分离出来,或者如何避免在定义文档模型的地方调用@instance.register?

如何将umongo的对象文档模型从主web应用程序中分离出来,或者如何避免在定义文档模型的地方调用@instance.register?
EN

Stack Overflow用户
提问于 2020-11-17 17:04:21
回答 1查看 282关注 0票数 2

当使用烧瓶或FastAPI创建web应用程序时,会有一个基本上实例化并运行所有内容的main.py文件。我认为这也是数据库连接和初始化的合适位置。因此,理想情况下,我希望有一个单独的model.py文件,它基本上只有对象文档映射定义,而没有其他任何内容。

在乌龙戈有可能做这样的事吗?

我的意思是,我们需要在每个对象文档映射类之上调用@instance.register。但是,如果这是在一个单独的文件中,而DB不是在那里初始化的,那么在该文件中就没有实例。实例将在main.py文件中声明。

例如,当您使用Tortoise时,它允许您将整个model.py文件作为一个模块传递,并向FastAPI注册,如下所示-

代码语言:javascript
复制
register_tortoise(
    app,
    db_url=os.environ.get("DATABASE_URL"),
    modules={"models": ["models.model"]}, #model -> model.py which has all the class definitions
    generate_schemas=True
)

对于演示,您可以使用下面的model.py文件内容-

代码语言:javascript
复制
from umongo import Document
from umongo.fields import StringField, URLField, DateTimeField
from datetime import datetime

class WebData(Document):
    url = URLField()
    summary = StringField()
    created_at = DateTimeField(missing=datetime.now)

    def __str__(self):
        return self.url

下面的main.py文件使用FastAPI -

代码语言:javascript
复制
from fastapi import FastAPI
from pymongo import MongoClient
from umongo import Instance

#db = MongoClient().test
#instance = Instance(db)

app = FastAPI()

@app.get('/ping')
async def pong():
    return {'ping': 'pong'}


if __name__ == "__main__":
    import uvicorn
    uvicorn.run("app.main:app", host="0.0.0.0", port=8000, reload=True)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-18 12:58:19

您可以在导入时实例化实例,但在app init传递它一个DB连接。

common.py

代码语言:javascript
复制
from umongo.frameworks import PyMongoInstance


instance = PyMongoInstance()

model.py

代码语言:javascript
复制
from umongo import Document

from .common import instance


@instance.register
class MyDocument(Document)

init.py

代码语言:javascript
复制
from .common import .instance
import .model


def create_app():
    database = MongoClient().test
    instance.init(database)
    ...

(注意:在umongo 3 beta中,instance.init被重命名为instance.set_db。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64879897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档