On Jun 21, 10:02 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:

> yes please see the "polymorphic association" example included in the 
> distribution .

Thanks! It seems there's nothing SQLAlchemy can't do :).

Btw, since the examples are a bit complicated, here is just for
reference in case
someone comes by this thread later, a simpler example:

TAGS = Table('tags', meta,
    Column('id', Integer, primary_key=True),
    Column('type', String),
    Column('object_id', Integer),
    Column('name', String))
DOGS = Table('dogs', meta,
    Column('id', Integer, primary_key=True),
    Column('name', String))
CATS = Table('cats', meta,
    Column('id', Integer, primary_key=True),
    Column('name', String))

class Tag(object):
    def __init__(self, type, name):
        self.type, self.name = type, name
    def __repr__(self):
        return u'<Tag {self.type}: {self.name}>'.format(self=self)

class Dog(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return u'<Dog {self.id}:{self.name}>'.format(self=self)

class Cat(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return u'<Cat {self.id}:{self.name}>'.format(self=self)

tags_mapper = mapper(Tag, TAGS)
dogs_mapper = mapper(Dog, DOGS)
cats_mapper = mapper(Cat, CATS)

# Magic happens below
pj = and_(DOGS.c.id == TAGS.c.object_id, TAGS.c.type == 'dog')
fk = [TAGS.c.object_id]
dogs_mapper.add_property('tags',
                         relationship(Tag,
                                      primaryjoin=pj,
                                      uselist=True,
                                      foreign_keys=fk))
pj = and_(CATS.c.id == TAGS.c.object_id, TAGS.c.type == 'cat')
cats_mapper.add_property('tags',
                         relationship(Tag,
                                      primaryjoin=pj,
                                      uselist=True,
                                      foreign_keys=fk))

>From now on it's simple:

dog = Dog('Goofy')
tag1, tag2 = Tag(type='dog', name='stray'), Tag(type='dog',
name='vaccinated')
dog.tags = [tag1, tag2]

-- 
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