• flask——flask-sqlachemy中的一对多,多对多关系


    一对多

    按创建单张表的方法,创建学院Deptment表

    class Deptment(db.Model):
        __tablename__ = 'deptments'
        dno = db.Column(db.Integer, primary_key=True)
        dname = Sname = db.Column(db.String(10),index=True)

    学院和学生是一对多的关系。Flask-SQLAlchemy是通过db.relationship()解决一对多的关系。在Dept中添加属性,代码如下:

    class Deptment(db.Model):
        ...
        students = db.relationship('Student', backref='dept')
        
        
    class Student(db.Model):
        ...
        dept_no = db.Column(db.Integer, db.ForeignKey('deptments.dno'))

    表的外键由db.ForeignKey指定,传入的参数是表的字段。db.relations它声明的属性不作为表字段,第一个参数是关联类的名字,backref是一个反向身份的代理,相当于在Student类中添加了dept的属性。例如,有Deptment实例dept和Student实例stu。dept.students.count()将会返回学院学生人数;stu.dept.first()将会返回学生的学院信息的Deptment类实例。一般来讲db.relationship()会放在这一边。

    多对多

    多对多的关系可以分解成一对多关系,例如:学生选课,学生与课程之间的关系:

    sc = db.Table('sc',  # 将其他两张表的关联起来
        db.Column('sno', db.String(10), db.ForeignKey('students.sno'))
        db.Column('cno',db.String(10), db.ForeignKey('courses.cno'))
        )
        
    Class Course(db.Model):
        __tablename__ = 'courses'
        cno = db.Column(db.String(10), primary_key=True)
        cname = db.Column(db.String(10), index=True)
        students = db.relationship('Student',
             secondary=sc,
             backref=db.backref('course',lazy='dynamic'),
             lazy='dynamic'
             )

    sc表由db.Table声明,我们不需要关心这张表,因为这张表将会由SQLAlchemy接管,它唯一的作用是作为students表和courses表关联表,所以必须在db.relationship()中指出sencondary关联表参数。lazy是指查询时的惰性求值的方式,这里有详细的参数说明,而db.backref是声明反向身份代理,其中的lazy参数是指明反向查询的惰性求值方式,SQLAlchemy鼓励这种方式声明多对多的关系。

    但是如果关联表中有自定义的字段,如sc表中添加成绩字段则需要更改表声明方式,将sc更改为继承db.Model的对象并设置sc:courses = 1:n 和sc:student = 1:n的关系。

    转载自:这里

  • 相关阅读:
    Git删除本地和远程文件
    MongoDB的安装和环境配置
    Cookie和Session的区别
    如何往npm上上传自定义的模块?
    JS的一些兼容性问题
    【网络流24题】 5. 圆桌问题 题解
    【网络流24题】 6. 最长不下降子序列问题 题解
    【网络流24题】 4. 魔术球问题 题解
    【网络流24题】 3. 最小路径覆盖问题 题解
    【网络流24题】 2. 太空飞行计划问题 题解
  • 原文地址:https://www.cnblogs.com/x54256/p/8405901.html
Copyright © 2020-2023  润新知