Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Sqlalchemy多对多关系_Python 2.7_Flask_Sqlalchemy - Fatal编程技术网

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
    ,可以随时添加。