query - Insertando datos en la relación Muchos a Muchos en SQLAlchemy
sqlalchemy sqlite (1)
En primer lugar, puede simplificar su relación de muchos a muchos mediante el uso de association_proxy .
Entonces, dejaría la relación tal como está para no interferir con lo que hace SA:
# here *tag_to_topic* is the relation Table object
Topic.tags = relation(''Tag'', secondary=tag_to_topic)
Y sugiero que simplemente cree una propiedad de envoltura simple que haga el trabajo de traducir la lista de cadenas a los objetos de relación (probablemente cambiará el nombre de la relación). Su clase de etiquetas se vería similar a:
class Topic(Base):
__tablename__ = ''topic''
id = Column(Integer, primary_key=True)
# ... other properties
def _find_or_create_tag(self, tag):
q = Tag.query.filter_by(name=tag)
t = q.first()
if not(t):
t = Tag(tag)
return t
def _get_tags(self):
return [x.name for x in self.tags]
def _set_tags(self, value):
# clear the list first
while self.tags:
del self.tags[0]
# add new tags
for tag in value:
self.tags.append(self._find_or_create_tag(tag))
str_tags = property(_get_tags,
_set_tags,
"Property str_tags is a simple wrapper for tags relation")
Entonces este código debería funcionar:
# Test
o = Topic()
session.add(o)
session.commit()
o.str_tags = [''tag1'']
o.str_tags = [''tag1'', ''tag4'']
session.commit()
Supongamos que tengo 3 clases en SQLALchemy: Topic
, Tag
, Tag_To_Topic
.
¿Es posible escribir algo como:
new_topic = Topic("new topic")
Topics.tags = [''tag1'', ''tag2'', ''tag3'']
Me gustaría insertar automáticamente ''tag1'', ''tag2'' y ''tag3'' en la tabla de etiquetas, y también insertar la relación correcta entre new_topic
y estas 3 etiquetas en la tabla Tag_To_Topic
.
Hasta ahora no he podido averiguar cómo hacer esto debido a la relación de muchos a muchos. (Si fuera uno a muchos, sería muy fácil, SQLAlchemy ya lo haría por defecto. Pero esto es muchos a muchos).
es posible?
Gracias, Boda Cydo.