2011-10-25 11 views
8

cuando tengo que quitar un objeto de relación ORM declarativa de muchos a muchos, se supone que debo hacer esto:¿Cómo eliminar todos los elementos de la colección muchos a muchos en SqlAlchemy?

blogpost.tags.remove(tag) 

Bueno. ¿Qué se supone que debo hacer si necesito purgar todas estas relaciones (no solo una)? Situación típica: me gustaría establecer una nueva lista de etiquetas para mi blogpost. Así que tengo que ...:

  1. Retire todas las relaciones existentes entre que entrada de blog y las etiquetas.
  2. Establezca nuevas relaciones y cree nuevas etiquetas si no existen.

Por supuesto, podría haber una mejor manera de hacerlo. En ese caso, házmelo saber.

Respuesta

18

Este es el lenguaje estándar de Python para la limpieza de una lista - asignar a la “lista completa” rebanada:

blogpost.tags[:] = [] 

En lugar de la lista vacía, es posible que desee asignar el nuevo conjunto de etiquetas directamente.

blogpost.tags[:] = new_tags 

las relaciones de SQLAlchemy son instrumented attributes, lo que significa que mantienen la interfaz de una lista (o conjunto, dict, etc), pero los cambios se reflejan en la base de datos. Esto significa que cualquier cosa que pueda hacer con una lista es posible con una relación, mientras que SQLA escucha de manera transparente los cambios y actualiza la base de datos en consecuencia.

+7

O póngalo de otra manera: SQLAlchemy es increíble. – ereOn

+1

¿Por qué no simplemente 'blogpost.tags = new_tags'? (sin [:]) – Devi

+1

Cuando pruebo esto ahora (diciembre de 2014, SQLAlchemy 0.9) obtengo el objeto "TypeError: 'AppenderBaseQuery' no admite la asignación de elementos". –

5

Confrimido por lo que Two-Bit Alchemist ha informado.

blogpost.tags[:] = new_tags 

se quejan de

TypeError: 'AppenderBaseQuery' object does not support item assignment 

Pero

blogpost.tags = new_tags 

parece funcionar bien.

Cuestiones relacionadas