На странице профиля пользователя я хочу отобразить файлы курса, частью которого он является. Вот код в flask и flask_sqlalchemy, который я написал в своем models.py
У меня ниже работает код, но он неэффективен, как вы можете видеть.
files = []
for i in User.query.get(1).course:
files.extend(i.files)
I хочу сделать что-то вроде ниже, что не работает по некоторым причинам.
>>> db.session.query(File).join(course_files).join(course_students).all()
Traceback Exception (most recent call):
#
Полный исходный код с отношениями.
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
admin = db.Column(db.Boolean, default=False)
username = db.Column(db.String(64), index=True, unique=True)
mobile = db.Column(db.Integer, index=True, unique=True)
password_hash = db.Column(db.String(128))
last_seen = db.Column(db.DateTime, default=datetime.utcnow)
course_students = db.Table(
'course_students',
db.Column('course_id', db.Integer, db.ForeignKey('course.id')),
db.Column('user_id', db.Integer, db.ForeignKey('user.id'))
)
course_files = db.Table(
'course_files',
db.Column('course_id', db.Integer, db.ForeignKey('course.id')),
db.Column('file_id', db.Integer, db.ForeignKey('file.id'))
)
class Course(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
fees = db.Column(db.String)
timing = db.Column(db.Time, nullable=False)
students = db.relationship('User', secondary=course_students,
backref=db.backref('course', lazy='dynamic'))
files = db.relationship('File', secondary=course_files,
backref=db.backref('course', lazy='dynamic'))
def __repr__(self):
return f'<Course({self.name})>'
class File(db.Model):
id = db.Column(db.Integer, primary_key=True)
filename = db.Column(db.String)
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
data = db.Column(db.LargeBinary)
length = db.Column(db.Integer, default=0)
mime_type = db.Column(db.String, default='application/octet-stream')