2011-10-25 71 views
8

,當我需要從聲明ORM許多一對多的關係中刪除一個對象,我應該這樣做:如何從SqlAlchemy中的多對多集合中刪除所有項目?

blogpost.tags.remove(tag) 

嘛。如果我需要清除所有這些關係(不只是一個),我該怎麼辦?典型的情況:我想爲我的博客帖子設置一個新的標籤列表。所以,我需要...:

  1. 刪除所有現有的關係是博客帖子和標籤之間
  2. 設置新關係並創建新標記(如果它們不存在)。

當然,可能有更好的方法來做到這一點。在這種情況下,請讓我知道。

回答

18

這是爲了清除列表中的標準Python成語 - 分配給「整個列表」切片:

blogpost.tags[:] = [] 

取而代之的是空單的,你可能想直接分配一套新的標籤。

blogpost.tags[:] = new_tags 

的SQLAlchemy的關係instrumented attributes,這意味着它們保持一個列表(或一組,字典等)的接口,但是任何的變化都反映到數據庫中。這意味着任何你可以用列表做的事情都可以通過關係來實現,而SQLA透明地監聽這些更改並相應地更新數據庫。

+7

或者換句話說:SQLAlchemy很棒。 – ereOn

+1

爲什麼不只是'blogpost.tags = new_tags'? (沒有[:]) – Devi

+1

當我現在嘗試這個(2014年12月,SQLAlchemy 0.9)我得到「TypeError:'AppenderBaseQuery'對象不支持項目分配。」 –

5

Two-Bit Alchemist報告的內容充滿信心。

blogpost.tags[:] = new_tags 

會抱怨

TypeError: 'AppenderBaseQuery' object does not support item assignment 

blogpost.tags = new_tags 

似乎很好地工作。

相關問題