Hi All,

We're looking to add tags to a number of 'entities' within our
application. A simplified data structure would be:

Image:
        id
        file
        title
        description

Article:
        id
        text

Tag:
        id
        value


Entity_tags:
        id
        entity_type      ('image' or 'article'
        entity_id        (PK of the image/article table)
        tag_id

We've got the following (highly simplified) structure:

image_table = Table('image', meta.metadata,     
        Column('id', types.Integer, primary_key=True), ) 

article_table = Table('article', meta.metadata,     
        Column('id', types.Integer, primary_key=True), ) 

tag_table = Table('tag', meta.metadata,     
        Column('id', types.Integer, primary_key=True),
        Column('name', types.Unicode(50), unique=True), ) 

entity_tag_table = Table('entity_tag', meta.metadata,     
        Column('tag_id', types.Integer, ForeignKey(tag_table.c.id)),
        Column('entity_type', types.String, nullable=False),
        Column('entity_id', types.Integer, nullable=False),
) 

# And the ORM Mappings:

class Image(object):     pass 
class Article(object):     pass 
class Tag(object):     pass 
class EntityTag(object):     pass 

orm.mapper(Image, image_table, properties={     
'tags': orm.relation(Tag, secondary=entity_tag_table,
        primaryjoin=and_(image_table.c.id==EntityTag.entity_id,
        EntityTag.entity_type=='image'),        
        secondaryjoin=EntityTag.tag_id==Tag.id,
        foreignkeys=[EntityTag.entity_id, EntityTag.tag_id],     ), 
}) 

orm.mapper(Article, article_table, properties={
'tags': orm.relation(Tag, secondary=entity_tag_table,
        primaryjoin=and_(article_table.c.id==EntityTag.entity_id,
        EntityTag.entity_type=='article'),
        secondaryjoin=EntityTag.tag_id==Tag.id,
        foreignkeys=[EntityTag.entity_id, EntityTag.tag_id],     ), 
})


When we append to the image.tags collection, the entity_tag table needs
to know that the entity_type is 'image', but we can't seem to set that.

What is the standard way of dealing with this problem?

Is there the concept of a generic foreign key in SQLAlchemy?

Does anyone know if this database pattern has a formal name?

TIA,
Jim



-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to