我想将我的模型类分离到models目录中的单独文件中。我想要一个单独的文件用于
我不确定如何组织项目来实现这一目标。
我尝试将主要导入文件放入目录的 init .py中,并将它们导入各个模型文件中,但是我不知道将db.generate_mapping()放在哪里。这样所有类都可用。我猜想这是大型应用程序的最佳实践。此时我的应用程序中大约有150张桌子。
任何帮助/指针将不胜感激。
答案 0 :(得分:5)
您可以使用以下项目结构:
# /myproject
# settings.py
# main.py
# /models
# __init__.py
# base.py
# requisitions.py
# workorders.py
# sales_orders.py
settings.py
是具有数据库设置的文件:
# settings.py
db_params = {'provider': 'sqlite', 'filename': ':memory:'}
main.py
是启动应用程序时的文件。您将db.generate_mapping
放在这里:
# 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
)中:
# base.py
from pony import orm
db = orm.Database()
class User(db.Entity):
name = Required(str)
orders = Set('Order')
请注意,在User
模型中,我可以引用在另一个模块中定义的Order
模型。您也可以将其写为
orders = Set(lambda: db.Order)
不幸的是,目前像PyCharm这样的IDE无法识别db.Order
指向特定的Order
类。您可以直接导入和使用Order
类,但是在某些情况下,它将导致循环导入的问题。
在其他模型文件中,您从db
导入了.base
:
# 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
之前定义了所有模型类:
# /models/__init__.py
from .base import db
from . import workorders
...
然后您可以写
from models import db
将访问模型作为db
属性(例如db.User
,db.Order
等)访问。
如果您想直接在代码中引用模型而不是将它们作为db
属性来访问,则可以将所有模型导入__init__.py
:
# /models/__init__.py
from .base import db, User
from .workorders import Order
...
然后您可以将模型类导入为:
from models import db, User, Order, ...