如何在子类中保持SQLAlchemy关系的功能?

时间:2019-02-04 13:04:35

标签: python sqlalchemy

我已经编写了一个由“后端”和“前端”组成的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'

(我知道为什么会发生此错误。无需说明)。

0 个答案:

没有答案