Давайте предположим ситуацию, в которой есть 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')
Очевидно, что в примере выше отсутствует присоединение пользователя, потому что я не знаю, как его правильно применить.