zoukankan      html  css  js  c++  java
  • 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的关系。

    转载自:这里

  • 相关阅读:
    关于dependency的scope
    Enum
    vim
    postgres函数
    Static块与线程安全
    查看文件夹及文件大小df du
    mac下安装jdk
    硬盘修复原理
    关于Jquery的Accordion在IE下闪烁,不稳定的问题
    vmare安装linux问题总结4(redhat在启动时卡在sendmail很久)
  • 原文地址:https://www.cnblogs.com/x54256/p/8405901.html
Copyright © 2011-2022 走看看