我已经编写了一个由“后端”和“前端”组成的SQLAlchemy应用程序(后端是填充数据库的服务,前端是显示该数据的WSGI Web应用程序)。
前端和后端都导入一个公共模块(“模型”),该模块包含SQLAlchemy ORM类定义,而没有其他内容。在前端和后端中,我定义了ORM基类的子类,这些子类添加了一些方法来执行应用程序的实际工作。我发现这是一种优雅而干净的解决方案,可以将常见事物(数据库结构)与细节(数据输入和检索)分开。
但是,这显然破坏了SQLAlchemy的关系,这些关系在“模型”模块中定义,因此不知道派生的类及其方法。下面是一个示例。
所以我的问题是:如何在ORM(子)类中添加模块特定的方法,并且仍然使用SQLAlchemy的关系?
models.py
# pure SQLAlchemy ORM declarations, imported by various modules
class JobT(Base):
id = Column(Integer, primary_key=True)
tool = relationship('ToolT', back_populates="jobs", uselist=False)
class ToolT(Base):
id = Column(Integer, primary_key = True)
jobs = relationship('JobT', back_populates="tool")
backend.py
# defines derived classes that add actual functionality to the objects
from models import ToolT, JobT
class Tool(ToolT):
def fancy_method(self):
pass
class Job(JobT):
def do_stuff(self):
foo = self.tool.fancy_method()
>>> job = Job(...)
>>> job.do_stuff()
AttributeError: 'ToolT' object has no attribute 'do_stuff'
(我知道为什么会发生此错误。无需说明)。