如何从SqlAlchemy中的多对多集合中删除所有项目?

Hon*_*rek 11 python many-to-many sqlalchemy

当我需要从声明性ORM多对多关系中删除一个对象时,我应该这样做:

blogpost.tags.remove(tag)
Run Code Online (Sandbox Code Playgroud)

好.如果我需要清除所有这些关系(不仅仅是一个),我该怎么办?典型情况:我想为我的博客帖子设置一个新的标签列表.所以我需要...:

  1. 删除该博客帖子和标签之间的所有现有关系.
  2. 设置新关系并创建新标记(如果它们不存在).

当然,可以有更好的方法来做到这一点.在那种情况下,请告诉我.

Pet*_*rin 21

这是用于清除列表的标准Python习惯用法 - 分配给"整个列表"切片:

blogpost.tags[:] = []
Run Code Online (Sandbox Code Playgroud)

您可能希望直接分配新的标记集,而不是空列表.

blogpost.tags[:] = new_tags
Run Code Online (Sandbox Code Playgroud)

SQLAlchemy的关系是检测属性,意味着它们保持列表(或集合,字典等)的接口,但任何更改都反映在数据库中.这意味着您可以使用关系对列表执行任何操作,而SQLA会透明地侦听更改并相应地更新数据库.

  • 或者换句话说:SQLAlchemy太棒了. (7认同)
  • 为什么不只是`blogpost.tags = new_tags`?(没有 [:]) (2认同)
  • 当我现在尝试此操作时(2014 年 12 月,SQLAlchemy 0.9),我收到“TypeError:'AppenderBaseQuery' 对象不支持项目分配。” (2认同)

Xua*_* Hu 9

对于两位炼金术士的报道感到震惊.

blogpost.tags[:] = new_tags
Run Code Online (Sandbox Code Playgroud)

会抱怨

TypeError: 'AppenderBaseQuery' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)

blogpost.tags = new_tags
Run Code Online (Sandbox Code Playgroud)

似乎工作正常.