This does it. One small drawback is that since the field is now
defined as an attribute, one can't query on it (ie. session.query
(class_).filter_by(modified_by='jack')), but we don't envison such a
use case for this funcionality so it's OK for us.

Recap of what was done: table columns were defined as 'modified', but
these columns were renamed in mappers as '<tablename>_modified'. Then,
a 'modified' attribute was added to all classes (well, to the
superclass to that effect) that wraps the value of
'tablename_modified'. Phew!

On Nov 12, 5:06 pm, "Michael Bayer" <[email protected]> wrote:
> xaotuk wrote:
>
> > We have tried suggested, but: field 'modified' exists in both parent
> > and child tables, when we redefined property 'modified' in mapper with
> > something like this:
> > mapper(Child, child_table, properties={'modified' =
> > child_table.c.modified, ...}), modified field still returned value
> > from parent's table.
>
> here is an example illustrating how to move "modified" away as an
> attribute name within each mapped class, allowing them to be accessible
> separately despite the tables having the same column names.  If you want
> to set the parent's "modified" column on the child, use the
> "parent_modified" attribute:
>
> from sqlalchemy import *
> from sqlalchemy.orm import *
>
> engine = create_engine("sqlite://", echo=True)
>
> m = MetaData()
>
> parent = Table('parent', m,
>                 Column('id', Integer, primary_key=True),
>                 Column('type', String),
>                 Column('modified', String)
> )
>
> child = Table('child', m,
>                 Column('id', Integer, ForeignKey('parent.id'),
> primary_key=True),
>                 Column('modified', String)
> )
> m.create_all(engine)
>
> class Parent(object):
>     def __init__(self, modified):
>         self.modified = modified
>
>     def modified(self):
>         return self.parent_modified
>
>     def _set_modified(self, m):
>         self.parent_modified = m
>
>     modified = property(modified, _set_modified)
>
> class Child(Parent):
>     def modified(self):
>         return self.child_modified
>
>     def _set_modified(self, m):
>         self.child_modified = m
>
>     modified = property(modified, _set_modified)
>
> mapper(Parent, parent, polymorphic_on=parent.c.type,
> polymorphic_identity='parent', properties={
>     'parent_modified':parent.c.modified})
>
> mapper(Child, child, inherits=Parent, polymorphic_identity='child',
> properties={
>     'child_modified':child.c.modified
>
> })
>
> s = sessionmaker(engine)()
>
> p1 = Parent('p1')
> c1 = Child('c1')
> assert p1.modified == 'p1'
> assert c1.modified == 'c1'
>
> s.add_all([p1, c1])
> s.commit()
> assert p1.modified == 'p1'
> assert c1.modified == 'c1'
>
>
>
> > We also tried to add property to class like this:
>
> > class Parent(object) :
> >   table = None
> >   ...
> >   def _fieldFromQuery(self, field):
> >         if not self.table:
> >             return None
> >         return Session.object_session(self).execute(select([getattr
> > (self.table.c, field)]).where(self.table.c.id==self.id)).scalar()
>
> >     def _modified(self):
> >         return self._fieldFromQuery("modified")
>
> >     def _modified_by(self):
> >         return self._fieldFromQuery("modified_by")
>
> >     modified = property(_modified)
> >     modified_by = property(_modified_by)
>
> > where self.table is assigned just before mapper is created.
> > Mapper itself again redefined attribute 'modified' and 'modified_by'
> > so we were back to starting problem.
>
> > On Oct 29, 3:56 pm, "Michael Bayer" <[email protected]> wrote:
> >>bojanbwrote:
>
> >> > Hi,
>
> >> > Can I have identical column names in both parent and child classes
> >> > that are part of a joined-table inheritance? These are simply created,
> >> > created_by, modified, modified_by columns that are populated by
> >> > defaults defined for them (ie. default, server_default, onupdate).
>
> >> > The values are written to the database correctly, but I have a problem
> >> > reading them because parent's column values override child values. So,
> >> > if the parent has null values for modified, modified_by and the child
> >> > some actual values, ORM returns None for child.modified and
> >> > child.modified_by.
>
> >> use the "properties" dictionary to mapper to redefine the names.  or the
> >> declarative equivalent.
> >>  seehttp://www.sqlalchemy.org/docs/05/mappers.html#customizing-column-pro...
>
> >> > Suggestions?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to