Flask 資料庫高階多對多關係
阿新 • • 發佈:2019-02-09
在之前介紹的多對多關係中,關聯表就是一個簡單的表,不是模型,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)