PonyORM - 多个模型文件
PonyORM - multiple model files
我想将我的模型 类 分离到模型目录中的单独文件中。我想要一个单独的文件:
- 一般(身份验证和全局 classes/tables)
- 请购单(用于请购单的表格)
- 工单(用于工单的表)
- sales_orders(用于销售订单的表)
- ...等等
我不确定如何构建我的项目来实现这一目标。
我已经尝试将我的主要导入放入目录中的 init.py 中,然后将它们导入到单独的模型文件中,但我不知道将我的导入放在哪里db.generate_mapping() 这样所有 类 都可用。我猜这是大型应用程序的最佳实践。此时我的应用程序中有大约 150 个表。
任何 help/pointers 将不胜感激。
您可以使用以下项目结构:
# /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
class。 Order
class可以直接导入使用,但是在某些情况下会导致循环导入的问题。
在其他模型文件中,您从 .base
导入 db
:
# 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
之前定义所有模型 classes:
# /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
...
然后您可以将模型 classes 导入为:
from models import db, User, Order, ...
我想将我的模型 类 分离到模型目录中的单独文件中。我想要一个单独的文件:
- 一般(身份验证和全局 classes/tables)
- 请购单(用于请购单的表格)
- 工单(用于工单的表)
- sales_orders(用于销售订单的表)
- ...等等
我不确定如何构建我的项目来实现这一目标。
我已经尝试将我的主要导入放入目录中的 init.py 中,然后将它们导入到单独的模型文件中,但我不知道将我的导入放在哪里db.generate_mapping() 这样所有 类 都可用。我猜这是大型应用程序的最佳实践。此时我的应用程序中有大约 150 个表。
任何 help/pointers 将不胜感激。
您可以使用以下项目结构:
# /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
class。 Order
class可以直接导入使用,但是在某些情况下会导致循环导入的问题。
在其他模型文件中,您从 .base
导入 db
:
# 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
之前定义所有模型 classes:
# /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
...
然后您可以将模型 classes 导入为:
from models import db, User, Order, ...