美文网首页
Flask 中的一对多和多对多

Flask 中的一对多和多对多

作者: Fizz翊 | 来源:发表于2018-10-11 16:45 被阅读201次

    1.ForeignKey

    class Students(db.Model):
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        s_name = db.Column(db.String(20), unique=False, nullable=False)
        s_age = db.Column(db.Integer, default=18)
        s_g = db.Column(db.Integer, db.ForeignKey('grade.id'), nullable=True)
    
    class Grade(db.Model):
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        g_name = db.Column(db.String(30), unique=True, nullable=False)
        students = db.relationship('Students', backref='grade')
        __tablename__ = 'grade'
    

    flsk中的一对多

    在多的一方需要写一个字段s_g 在其中写上db.ForeignKey('grade.id'),参数为一对多的一的一方的主键。这个字段在数据库中是不存在的。

    在少的一方需要添加一个relationship字段 students = db.relationship('Students', backref='grade') ,

    backref为反向查询的关键字

    查询:

    • 正向查询(一查多)

      stus = Grade.query.get(id).students
      
    • 反向查询(多查一)

      the_grade = Student.query.get(id).grade
      

    2.ManyToMany

    class Students(db.Model):
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        s_name = db.Column(db.String(20), unique=False, nullable=False)
        s_age = db.Column(db.Integer, default=18)
        s_g = db.Column(db.Integer, db.ForeignKey('grade.id'), nullable=True)
    
    class Course(db.Model):
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        c_name = db.Column(db.String(10), unique=True, nullable=False)
        students = db.relationship('Students', secondary='s_c', backref='cou')
        __tablename__ = 'course'
    

    中间表:

    s_c = db.Table('s_c',
                   db.Column('s_id', db.Integer, db.ForeignKey('students.id'), primary_key=True),
                   db.Column('c_id', db.Integer, db.ForeignKey('course.id'), primary_key=True),
                   )
    

    多对多可以在任意一方中添加一个relationship字段,第一个参数为关联的另外一个表,第二个参数为中间表的表名,第三个参数backref是反向查询时的关键字

    在flask中多对多的中间表需要自己建立。建立的中间表的类为db.Table(),第一个参数为中间表的表名,然后在表中添加两个字段,这两个字段分别为关联的两个表的一对多的外键,也同为主键。

    查询

    • 正向查询(写有relationship的一边查另外一边)

      stus = Course.query.get(id).students
      
    • 反向查询

      grade = Students.query.get(id).cou
      

    相关文章

      网友评论

          本文标题:Flask 中的一对多和多对多

          本文链接:https://www.haomeiwen.com/subject/pynbaftx.html