Как сохранить функциональность SQLAlchemy в подклассах? - PullRequest
0 голосов
/ 04 февраля 2019

Я написал приложение 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'

(я знаю, почему этоошибка. Объяснение не требуется).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...