Как фильтровать отношения «многие ко многим» в Flask SQLAlchemy?

#python #flask #sqlalchemy

#python #flask #sql — алхимия

Вопрос:

Я создаю приложение flask, в котором проводятся лекции в школе.
Я должен ограничить предметы для учащихся по классам. Это означает отображение тем на странице темы, которые назначены классу. У меня есть отношения «Много ко многим» между моделью классов и моделью субъектов.

Модель классов

 class Class(db.Model):
    
    __tablename__="clases"

    id=db.Column(db.Integer, primary_key=True)
    campus=db.Column(db.String(15), nullable=False)
    grade=db.Column(db.String(5), nullable=False)
    section=db.Column(db.String(1), nullable=False)
    clas_incharge=db.Column(db.String(46))
    students=db.relationship("User", backref="clas", lazy="dynamic")
    subjects=db.relationship("Subject", secondary=sbjcts, lazy="dynamic", backref=db.backref("clases", lazy=True))
 

Предметная модель

 class Subjects(db.Model):

    __tablename__="subjects"

    id=db.Column(db.Integer, primary_key=True)
    name=db.Column(db.String(20), nullable=False)
    description=db.Column(db.String(80), nullable=False)
    lectures=db.relationship("Lecture", backref="subject", lazy="dynamic")
    resources=db.relationship("Resource", backref="subject", lazy="dynamic")
 

Таблица ассоциаций

 sbjcts=db.Table("sbjcts",
        db.Column("clas_id", db.ForeignKey("clases.id")),
        db.Column("subject_id", db.ForeignKey("subjects.id")))
 

Чего я хочу, так это как я могу сделать запрос, который возвращает объекты с определенным присвоенным классом
Условием здесь является класс, который я бы предоставил для получения объектов
Примечание: несколько классов могут иметь одинаковые предметы.

Ответ №1:

 db.session.query(Subjects).join(Subjects.clases).filter(Class.id==1).all()
 

Вышеуказанное должно сработать.

Ваша Class модель определяет отношение к Subjects . Вы также добавляете a backref here , который, по сути, добавляет атрибут clases к Subjects mapper, который определяет, что отношение Subject должно быть Class с точки зрения Subject .

Мы можем использовать это в определенных отношениях в нашем запросе, все еще предоставляя фильтр.

Также, чтобы было ясно, приведенный выше запрос вернет все объекты, имеющие данный класс. Если вы посмотрите на один из этих возвращаемых объектов Subject ORM, в нем будут перечислены все «классы», которые у него есть.