Фильтрация по связанным моделям с помощью основного API SQLAlchemy (с использованием AIOPG) - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь сделать что-то, что, я уверен, просто с помощью AIOPG, который может использовать базовый API sqlalchemy. Мой SQL не велик, так что вот где я падаю сюда.

модели

class School(Base):
    __tablename__ = 'schools'

    id = Column(Integer, primary_key=True, nullable=False)


sa_school = School.__table__


class SubjectCategory(Base):
    __tablename__ = 'subject_categories'

    id = Column(Integer, primary_key=True, nullable=False)
    name = Column(String(63))


sa_subject_category = SubjectCategory.__table__


class Subject(Base):
    __tablename__ == 'subjects'

    id = Column(Integer, primary_key=True, nullable=False)
    name = Column(String(63))
    category = Column(Integer, ForeignKey('subject_categories.id'), nullable=False)


sa_subject = Subject.__table__


class SchoolSubject(Base):
    __tablename__ = 'school_subjects'

    id = Column(Integer, primary_key=True, nullable=False)
    school = Column(Integer, ForeignKey('schools.id'), nullable=False)
    subject = Column(Integer, ForeignKey('subjects.id'), nullable=False)


sa_school_subject = SchoolSubject.__table__

Так что я просто пытаюсь получить все schools, которые преподают предметы, имеющие определенный subject_category ID.

В настоящее время у меня есть:

from sqlalchemy import select, join

school_c = sa_school.c
school_subj_c = sa_school_subject.c


async def get_schools(subject=None, subj_cat=None)
    query = select(
        [school_c.id, school_c.name]
    ).select_from(sa_school.join(sa_school_subject)
    if subj_cat:
        # Then I need to filter where a school_subj.subject.category == subj_cat
        pass
    elif subject:
        query = query.where(sa_school_subject.c.subject == subj)

    cur = await conn.execute(query)
    return [dict(b) async for b in cur]

1 Ответ

0 голосов
/ 05 мая 2020

После небольшого смазывания я могу просто сделать:

query = select(
    [school_c.id, school_c.name]
).select_from(sa_school.join(sa_school_subject.join(sa_subject)))
...