Как получить доступ к данным из транзитивных отношений? - PullRequest
0 голосов
/ 05 июля 2018

Допустим, у меня есть 3 таблицы, определенные в SQLAlchemy: Task, Job, Log, где Task определяет какую-то задачу, которая может быть выполнена, Job определяет конкретные значения выполненной задачи и Log хранит некоторую информацию о каждом исполнении. Таким образом, каждый журнал знает свой идентификатор работы, и каждая работа знает свой идентификатор задачи:

class Task(DeclarativeBase):
    __tablename__ = 'task'

    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)
    # ...

    jobs = relationship("Job", backref="task")


class Job(DeclarativeBase):
    __tablename__ = 'job'

    id = Column(Integer, primary_key=True)
    task_id = Column(Integer, ForeignKey("task.id"), nullable=False)
    # ...

    logs = relationship("Log", backref="job")


class Log(DeclarativeBase):
    __tablename__ = 'name'

    id = Column(Integer, primary_key=True)
    job_id = Column(Integer, ForeignKey("job.id"), nullable=False)
    # ...

В нашем графическом интерфейсе мы перечисляем все Log записи по порядку, чтобы наши клиенты могли их просмотреть. Однако нам нужно отфильтровать их сейчас, и мы хотим отфильтровать их по имени задачи. Мой наивный подход был новым методом в нашем LogDAO

class DAO(object):
    def __init__(self, session, model):
        """ :param session: The database session that is used for data access
            :param model: The db model class
        """
        self.session = session
        self.model = model


class LogDAO(DAO):
    def __init__(self, session):
        super(LogDAO, self).__init__(session, Log)

    # ...
    def with_task_name(task_name):
        self.session.query(self.model.job.task.name == task_name)

self.model.job существует, но self.model.job.task не существует. Есть ли другой элегантный способ фильтрации Log записей по Task имени?

1 Ответ

0 голосов
/ 06 июля 2018

Нашли это решение:

class LogDAO(DAO):
    # ...
    def with_task_name(task_name):
        return self.session.query(Log)
            .join(Log.job)
            .join(Job.task)
            .filter(Task.name == task_name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...