Как запросить файлы из курса, частью которого является студент? - PullRequest
1 голос
/ 15 января 2020

На странице профиля пользователя я хочу отобразить файлы курса, частью которого он является. Вот код в 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')



1 Ответ

1 голос
/ 17 января 2020

Трудно сказать без подробностей об исключении, но вы можете просто пропустить некоторую инструкцию в соединении, которая фильтрует запрос по текущему пользователю.

Если просматриваемый вами пользователь находится в переменной 'u', тогда запрос, подобный этому, возвращает только соответствующие файлы для этого пользователя.

db.session.query(File).join(course_files).join(course_students, course_students.c.user_id == u.id).all()

...