首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PonyORM -多模型文件

PonyORM -多模型文件
EN

Stack Overflow用户
提问于 2018-07-30 20:29:10
回答 1查看 1.7K关注 0票数 5

我希望将我的模型类分离到一个模型目录中的不同文件中。我希望有一个单独的档案:

  • 一般(身份验证和全局类/表)
  • 请购单(请购表)
  • 工作表(用于工作订单的表)
  • sales_orders (用于销售订单的表)
  • ...etc

我不知道如何组织我的项目来实现这一目标。

我尝试将主导入放到目录中的init.py中,并将这些导入到单独的模型文件中,但是我不知道将db.generate_mapping()放在哪里以便所有类都可用。我猜这是大型应用程序的最佳实践。目前,我的应用程序中有大约150张桌子。

如有任何帮助或指示,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-03 10:54:30

您可以使用以下项目结构:

代码语言:javascript
复制
# /myproject
#     settings.py
#     main.py
#     /models
#         __init__.py
#         base.py
#         requisitions.py
#         workorders.py
#         sales_orders.py

settings.py是一个具有数据库设置的文件:

代码语言:javascript
复制
# settings.py
db_params = {'provider': 'sqlite', 'filename': ':memory:'}

main.py是启动应用程序时的文件。你把db.generate_mapping放在这里:

代码语言:javascript
复制
# main.py
from pony import orm
import settings
from models import db
from your_favorite_web_framework import App

# orm.set_sql_degug(True)
db.bind(**settings.db_params)
db.generate_mapping(create_tables=True)

with orm.db_session:
    orm.select(u for u in db.User).show()

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

请注意,没有必要隐式导入所有模型,因为它们可以作为db对象的属性(如db.User)访问。

您可以将db对象放在base.py (或general.py)中,在其中定义核心模型:

代码语言:javascript
复制
# base.py
from pony import orm

db = orm.Database()

class User(db.Entity):
    name = Required(str)
    orders = Set('Order')

注意,在User模型中,我可以引用在另一个模块中定义的Order模型。你也可以把它写成

代码语言:javascript
复制
    orders = Set(lambda: db.Order)

不幸的是,像PyCharm这样的IDE目前还不能认识到db.Order指的是特定的Order类。您可以直接导入和使用Order类,但在某些情况下,它会导致循环导入的问题。

在其他模型文件中,从db导入.base

代码语言:javascript
复制
# workorders.py
from pony import orm
from .base import db

class Order(db.Entity):
    description = Optional(str)
    user = Required('User')

/models/__init__.py中,导入所有模块以确保在调用generate_mapping之前定义所有模型类:

代码语言:javascript
复制
# /models/__init__.py
from .base import db
from . import workorders
...

然后你可以写

代码语言:javascript
复制
from models import db

并以db属性(如db.Userdb.Order等)访问模型。

如果您想直接引用代码中的模型,而不是将它们作为db属性访问,则可以导入__init__.py中的所有模型。

代码语言:javascript
复制
# /models/__init__.py
from .base import db, User
from .workorders import Order
...

然后,您可以将模型类导入为:

代码语言:javascript
复制
from models import db, User, Order, ...
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51601838

复制
相关文章

相似问题

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