Flask 数据库高级多对多关系

之前介绍了多对多关系:http://blog.csdn.net/ying847782627/article/details/51333090

        在之前介绍的多对多关系中,关联表就是一个简单的表,不是模型,SQLAlchemy 会自动接管这个表。多对多关系可以分解成原表和关联表之间的两个一对多关系。这个表里面存储了原表的两个主键作为自己的联合主键。

存在的问题:因为在这种关联表里操作的时候都是面向对象的,添加,删除等操作都是直接找到这个对象(具体见上篇)。如果需要添加第三个字段来区分这些记录的先后关系,没办法添加进去的,关联表完全是SQLAlchemy掌握的内部表。所以,采用了新的多对多关系模型的设计。

        为了能在关系中处理自定义的数据, 我们必须提升关联表的地位,使其变成程序可访问的模型。下面是新的关联表设计。设计背景为上节所述学生与学院多对多关系。

<span style="font-size:18px;"><span style="font-size:18px;"></span></span><pre name="code" class="python">app\models.py

class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True).............................................. department = db.relationship('User_Department', foreign_keys=[User_Department.user_id], backref=db.backref('user', lazy='joined'), lazy='dynamic', cascade='all, delete-orphan')

 
 

app\models.py

class Department(db.Model):
    __tablename__ = 'departments'
    id = db.Column(db.Integer, primary_key=True)
    department = db.Column(db.String(100))
    department2 = db.Column(db.String(100))

    user = db.relationship('User_Department',
                                 foreign_keys=[User_Department.departmentR_id],
                                 backref=db.backref('department', lazy='joined'),
                                 lazy='dynamic',
                                 cascade='all, delete-orphan')

<span style="font-size:18px;"></span><pre name="code" class="python">app\models.py

class User_Department(db.Model): __tablename__ = 'users_deparments' user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True) departmentR_id = db.Column(db.Integer, db.ForeignKey('departments.id'), primary_key=True) is_changed = db.Column(db.Boolean, default=False)

 
 

下面介绍一下添加删除的实现:

P_department=Department.query.get(form.pre_department.data)
P_de=User_Department(user=user, department=P_department, is_changed=True)
db.session.add(P_de)


deparments=user.department.filter_by(user_id=user.id).all()
for de in deparments:
   db.session.delete(de)



你可能感兴趣的:(数据库,flask,多对多关系,关联表)