flask alchemy多對多關係注意事項

2021-09-24 23:19:17 字數 1558 閱讀 2077

級聯刪除

一對多關係,user為一,task為多。

一的一方通過relationship關聯到多的一方,多的一方設定foreignkey關聯到一的一方。

relationship中設定cascade=『all, delete-orphan』 與 passive_deletes = true,

foreignkey中設定ondelete = 『cascade』。

即可完成刪除user的同時,刪除與該user物件相關的task物件。

例如:user的id為1,同時任務列表中,任務id為1和2的兩個任務的user_id為1,即user中id為1的使用者擁有任務id為1和2的兩個任務。通過刪除id為1的user,任務表中id為1和2的兩個task物件也會同時刪除。

from . import db

class user(db.model):

tablesname = 『users』

id = db.column(db.integer, primary_key = true)

username = db.column(db.string(64), unique = true)

tasks = db.relationship(『task』, backref=『user』, lazy=『dynamic』, cascade=『all, delete-orphan』, passive_deletes = true)

defrepr(self):

return 『』 % self.username

class task(db.model):

tablesname = 『tasks』

id = db.column(db.integer, primary_key = true)

taskname = db.column(db.string(64), unique = true)

user_id = db.column(db.integer, db.foreignkey(『users.id』, ondelete=『cascade』))

defrepr(self):

return 『』 % self.taskname

級聯查詢

舉例如下:

def _get_activites(activity_type, today):

query = activity.query

.join(activitytype,

activity.id == activitytype.activity_id)

.filter(activitytype.show_type == activity_type,

activity.is_publish == 1,

activity.start <= today,

activity.end > today)

.order_by(activity.publish_time)

return query.all()

注意:不能同時和lazy/use-list引數連用,不然會發現資料庫查不出來

雙向多對多

雙向多對多會通過乙個中間表來維持關聯關係 雙向多對多關係中必須指定乙個關係維護端 否則中間表裡會出現主鍵重複的問題 例如 標籤類tags和商品類goods 乙個標籤可對應多種商品 乙個商品也能有多個標籤 首先在兩個類中各建乙個對方型別的set作屬性 用到的註解解釋 商品類goods 需要用 join...

Django ORM 一對多 和 多對多

在 models.py 上定義 class province models.model name models.charfield max length 32 def str self return self.name class city models.model name models.char...

怎樣理解多對多

a表,a id,a name,a tel三個字段。b表,b id,b address,b sol三個字段。關聯表,ref id,a id,b id,儲存著ab兩表的id,比如 a有 a0001,zhang3,139555533 a0002,li4,1397788888 a0003,wang5,136...