#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, в нем будут перечислены все «классы», которые у него есть.