¿Cómo eliminar registros de la tabla de muchos a muchos (secundarios) en SQLAlchemy?

Tengo problemas para eliminar registros de la tabla PostTag que contiene la columna Post y Tag . Esta es mi tabla de relaciones:

 tags = db.Table('PostTag', db.Column('Tag', db.Integer, db.ForeignKey('Tag.Id')), db.Column('Post', db.Integer, db.ForeignKey('Post.Id')) ) 

y

 tags = db.relationship(Tag, secondary=tags, backref=db.backref('Post', lazy='dynamic')) 

Cuando hago esto:

 from models.Post import Post posts = Post.query.join(Post.tags).filter(Post.Id == id).all() if(posts): return posts return False 

y entonces

 for posttag in post[0].tags: db.session.delete(posttag) db.session.flush() 

Las filas de la relación muchos a muchos se eliminan, pero también los registros de la tabla de Tag .

Solo necesito eliminar registros de la tabla PostTag para alguna condición ( Post=1 por ejemplo)

Busqué en internet pero no encontré nada concluyente. No necesito cascada en relación de muchos a muchos.

Este es el registro de SQL:

  297 Query DELETE FROM `PostTag` WHERE `PostTag`.`Tag` = 14 AND `PostTag`.`Post` = 3 297 Query DELETE FROM `PostTag` WHERE `PostTag`.`Tag` = 14 AND `PostTag`.`Post` = 18 297 Query DELETE FROM `Tag` WHERE `Tag`.`Id` = 14 

Última fila 297 Query DELETE FROM Etiqueta WHERE Etiqueta . Id = 14 no debería estar allí.

ACTUALIZACIÓN / quizás solución

Resolví esto de alguna manera con:

 sql = 'DELETE FROM PostTag WHERE Post=%s' db.engine.execute(sql, post, ()) 

Pero eso no es solo la manera ORM. Lo mismo ocurre con el inserto. Voy a tratar de obtener esta manera resuelta ORM. Voy a publicar respuesta si hago desaparecer este problema.

Prueba esto:

 post = db.session.query(Post).get(1) post.tags = [] db.session.commit() 

Aquí estamos redefiniendo la colección post.tags a la matriz vacía y post.tags los cambios. Para explicar esto me referiré a los documentos de SQLAlchemy :

Las colecciones en SQLAlchemy están instrumentadas de forma transparente. La instrumentación significa que se realiza un seguimiento de las operaciones normales de la colección y que se escriben cambios en la base de datos en el momento de la descarga.

Por lo tanto, SQLAlchemy realiza un seguimiento de los cambios que realizamos en la colección post.tags y lo actualiza en la confirmación.

Si tuviéramos una sola etiqueta (digamos sometag ) podríamos usar el método de remove esta manera:

 post = db.session.query(Post).get(1) post.tags.remove(sometag) db.session.commit() 

Trate de eliminar objetos de la colección en su lugar:

 post[0].tags.clear() 

También puede eliminar elementos individuales:

 post[0].tags.remove(posttag)