在用户的个人资料页面上,我想显示他所属类(class)的文件。 这是我在 models.py 中编写的flask和flask_sqlalchemy中的代码
我已经让下面的代码工作了,但正如你所看到的,它的效率不高。
files = []
for i in User.query.get(1).course:
files.extend(i.files)
我想做如下的事情,但由于某些原因不起作用。
>>> 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')
最佳答案
如果没有异常详细信息,很难说,但您可能只是在连接中缺少一些过滤当前用户查询的指令。
如果您正在查看的用户位于变量“u”中,那么这样的查询只会返回该用户的相关文件。
db.session.query(File).join(course_files).join(course_students, course_students.c.user_id == u.id).all()
关于python - 如何查询学生所在类(class)的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59750041/