Я написал приложение SQLAlchemy, которое состоит из «внутреннего интерфейса» и «внешнего интерфейса» (внутренний компонент - это служба, которая заполняет базу данных, а внешний интерфейс - веб-приложение WSGI, представляющее эти данные).
И внешний, и внутренний интерфейсы импортируют общий модуль («модели»), который содержит определения класса SQLAlchemy ORM и ничего больше.В интерфейсе и бэкэнде я определяю подклассы базовых классов ORM, которые добавляют методы для выполнения реальной работы приложения.Я считаю это элегантным и чистым решением, позволяющим отделить общие вещи (структуру базы данных) от специфики (ввод и извлечение данных).
Однако это явно нарушает отношения SQLAlchemy, которые определены в модуле «models».и, следовательно, не знаю о производных классах и их методах.Ниже приведен пример.
Итак, мой вопрос: как я могу добавить специфичные для модуля методы в классы 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'
(я знаю, почему этоошибка. Объяснение не требуется).