Python 2.7 Sqlalchemy多对多关系
我有两个多对多关系表:Python 2.7 Sqlalchemy多对多关系,python-2.7,flask,sqlalchemy,Python 2.7,Flask,Sqlalchemy,我有两个多对多关系表: class Association(db.Model): __tablename__ = 'association' club_id = db.Column(db.Integer, db.ForeignKey('clubs.id'), primary_key=True) student_id = db.Column(db.Integer, db.ForeignKey('students.id'), primary_key=True) joi
class Association(db.Model):
__tablename__ = 'association'
club_id = db.Column(db.Integer, db.ForeignKey('clubs.id'), primary_key=True)
student_id = db.Column(db.Integer, db.ForeignKey('students.id'), primary_key=True)
joined_date = db.Column(db.String)
assoc_student = db.relationship("Student")
class Club(db.Model):
__tablename__ = 'clubs'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String)
location = db.Column(db.String)
club_assoc = db.relationship("Association")
class Student(db.Model):
__tablename__ = 'students'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
age = db.Column(db.String)
gender = db.Column(db.String)
问题:
1) 这两个查询之间有什么区别
students = db.session.query(Association).filter_by(club_id='1')
students = Association.query.filter_by(club_id='1')
他们似乎给出了同样的结果
2) 我正在尝试获取某个年龄段的学生列表,但以下查询不起作用:
db.session.query(Association).filter_by(Association.club_id=='1', Association.assoc_student.age=='15')
但我得到了这个错误:
AttributeError:与Association关联的“InstrumentedAttribute”对象和“Comparator”对象都没有属性“age”
这就是为什么我要用这个:
db.session.query(Student).join(Association).filter(Association.club_id=='1', Student.age=='15')
没有“加入”有更好的方法吗?也许使用“backref”
1) 这两个查询之间有什么区别
students = db.session.query(Association).filter_by(club_id='1')
students = Association.query.filter_by(club_id='1')
他们做几乎相同的事情。前者是查询使用SQLAlchemy
提供的对象的方法(库Flask
用于访问数据库)
后者是查询由SQLAlchemy
库添加的模型的方便方法。它使您的查询更具可读性+使用很少有用的方法扩展查询。查看flask\u sqlalchemy.BaseQuery
类的源代码以查看它们:get\u或\u 404()
,first\u或\u 404()
和paginate()
通常,您希望使用后一种方法来查询对象
2) 我正在尝试获取某个年龄段的学生列表,但下面的查询不起作用
这里有两件事:
filter\u by()
与SQL表达式一起使用,而不是kwargs
,这是不正确的filter()
时,不能在关系上指定列(如Association.assoc\u student.age
)。唯一允许的格式是ModelName.column\u name
。这就是它失败的原因db
(如果您在另一个文件中定义查询):
谢谢@yaroslav Admin。我不确定我的课程结构,我远离“backref”,因为我不确定我是否需要它来访问学生的文化课。你的课程结构很好。如果需要
backref
,可以随时添加。