Как удалить все элементы из коллекции «многие ко многим» в SqlAlchemy? - PullRequest
11 голосов
/ 25 октября 2011

когда мне нужно удалить объект из декларативного отношения ORM «многие ко многим», я должен сделать это:

blogpost.tags.remove(tag)

Хорошо.Что я должен делать, если мне нужно очистить все эти отношения (не только одно)?Типичная ситуация: я бы хотел установить новый список тегов для моего поста.Поэтому мне нужно ...:

  1. Удалить все существующие отношения между этим постом и тегами.
  2. Установить новые отношения и создать новые теги, если они не 'не существует.

Конечно, может быть лучший способ сделать это.В этом случае, пожалуйста, дайте мне знать.

Ответы [ 2 ]

21 голосов
/ 25 октября 2011

Это стандартная идиома Python для очистки списка - назначение среза «весь список»:

blogpost.tags[:] = []

Вместо пустого списка, вы можете напрямую назначить новый набор тегов.

blogpost.tags[:] = new_tags

Отношения SQLAlchemy - это инструментальные атрибуты , означающие, что они сохраняют интерфейс списка (или набора, dict и т. Д.), Но любые изменения отражаются в базе данных.Это означает, что все, что вы можете сделать со списком, возможно с отношением, в то время как SQLA прозрачно прослушивает изменения и соответственно обновляет базу данных.

9 голосов
/ 28 апреля 2015

Подтверждено за то, что сообщил Двухбитный Алхимик .

blogpost.tags[:] = new_tags

будет жаловаться на

TypeError: 'AppenderBaseQuery' object does not support item assignment

Но

blogpost.tags = new_tags

Вроде нормально работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...