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

2024-06-01 20:37:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

blogpost.tags.remove(tag)

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

  1. 删除该blogpost和标记之间的所有现有关系。
  2. 如果不存在新关系,则设置新关系并创建新标记。

当然,还有更好的办法。那样的话请告诉我。


Tags: 对象标记声明列表关系tagtagsorm
2条回答

这是清除列表的标准Python习惯用法-分配给“整个列表”部分:

blogpost.tags[:] = []

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

blogpost.tags[:] = new_tags

SQLAlchemy的关系是instrumented attributes,这意味着它们保留列表(或set、dict等)的接口,但任何更改都反映在数据库中。这意味着您可以通过关系对列表执行任何操作,而SQLA则透明地监听更改并相应地更新数据库。

确认了Two-Bit Alchemist所报告的内容。

blogpost.tags[:] = new_tags

会抱怨

TypeError: 'AppenderBaseQuery' object does not support item assignment

但是

blogpost.tags = new_tags

看来效果不错。

相关问题 更多 >