SQLAlchemy Multi Table соединение в поле отношений в классе модели - PullRequest
1 голос
/ 20 марта 2019

Давайте предположим ситуацию, в которой есть 3 таблицы или, можно сказать, классы моделей:

  • Пользователь
  • Школа
  • Предмет

В таком отношении: User ManyToMany School ManyToMany Subject.Эти отношения «многие ко многим» определены в таблицах ассоциаций следующим образом:

school_user = db.Table('school_user ',
                     db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
                     db.Column(school_id', db.Integer, db.ForeignKey('schools.id')))


subject_school = db.Table('subject_school ',
                           db.Column('school_id', db.Integer, db.ForeignKey('schools.id')),
                           db.Column('subject_id', db.Integer, db.ForeignKey('subjects.id')))

class User(db.Model):
    schools= db.relationship('School', secondary=school_user , backref=db.backref('users', lazy='dynamic'))

class Subject(db.Model):
    schools= db.relationship('School',
                              secondary=subject_school,
                              backref=db.backref('subjects',
                                                 lazy='dynamic'))

Я хотел бы запросить все Subjects, принадлежащие Schools, к которым User относится.

Я легко могу добиться этого с помощью:

class User:
    @property
    def subjects(self):
        return (Subject
                .query
                .join(School, Subject.schools)
                .join(User, School.users)
                .filter(User.id == self.id)
                .all())

Мой вопрос: это достижимо через поле отношений SQLAlchemy с использованием primaryjoin и secondaryjoin?Что-то вроде (не работает, в демонстрационных целях):

class User:
    subjects = db.relationship('Subject', 
                               secondary=subject_school, 
                               secondaryjoin='School.id==subject_school.c.school_id', 
                               primaryjoin='Subject.id==subject_school.c.subject_id')

Очевидно, что в примере выше отсутствует присоединение пользователя, потому что я не знаю, как его правильно применить.

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