I have entities which I’d like to tag with tags from a vocabulary. The
associations between entities and tags are implemented with „manual M:N“,
because they carry more information.
class Entity(Base):
id = Column(Integer, primary_key=True)
tags = relationship('TagAssociation', backref='entity',
cascade="all, delete, delete-orphan")
class Vocabulary(Base):
id = Column(Integer, primary_key=True)
name = Column(String(255), nullable=False, unique=True)
class Tag(Base):
id = Column(Integer, primary_key=True)
vocabularyId = Column(Integer, ForeignKey(Vocabulary.id), nullable=False)
vocabulary = relationship(Vocabulary, lazy='joined',
backref=backref('tags', cascade='all,
delete-orphan'))
name = Column(String(50), nullable=False)
class TagAssociation(Base):
entityId = Column(Integer, ForeignKey(Entity.id), primary_key=True)
tagId = Column(Integer, ForeignKey(Tag.id), primary_key=True)
tag = relationship(Tag, lazy='joined‘)
Now I want to make sure that I don’t have more than one tag from a single
vocabulary on an entity. Currently I’m using the before_insert event on
TagAssociation which works well except in this case:
entity = Entity()
entity.tags.append(TagAssociation(entity=entity, tag=some_tag))
session.add(entity)
session.flush()
entity.tags = [TagAssociation(entity=entity,
tag=some_other_tag_from_same_vocabulary)]
session.flush()
When the validation function is called during the second flush, the collection
(assoc_to_be_inserted.entity.tags) has both tags in it (which I don’t
understand). I couldn’t find a way to detect if one of them is going to be
deleted. Hence, the validation fails, although the final result would be
correct.
Is there any event I can use to reliably implement that validation?
Thanks,
Tim
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.