2011-10-25 7 views
8

は、私がこれを行うことになっています:SqlAlchemyの多対多コレクションからすべてのアイテムを削除するにはどうすればいいですか?私は、宣言ORM多対多の関係からオブジェクトを削除する必要がある場合

blogpost.tags.remove(tag) 

まあ。私がこれらの関係すべてを消滅させる必要があるならば、私は何をすべきでしょうか?典型的な状況:新しいタグリストを自分のblogpostに設定したいのですが。

  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 

が正常に動作するようです。

関連する問題