Hello,

I have a question about using multiple polymorphic tables with different parents which relate to the the same parent table but other polymorphic child.

I have two tables staff (class Staff) and contract (class Contract).
The Staff table has an identity manager (class Manager) and the contract table has an identity peon (class Peon). I have a third table called payments. Payments has two identities identity StatusReport and BillableHours.

I want to have StausReport have a relationship to Peon ForeignKey('contract.id') and the BillableHours have a relationship to Manager ForeignKey('staff.id')

The relationships look like this:
staff.id => payments.user_id
contract.id => payments.user_id
payments.user_id => staff.id
payments.user_id => contract.id

I am using SQLAlchemy v0.5.8 on Python v2.6

Here is an *example* of one of the tests i have tried. I hope it gives a better idea of what I am tring to do (and is not just confusing). I get failures about specifying "foreign_keys" or "Could not locate any equated locally mapped column pairs..."
--------------------------------------------------------------

from   sqlalchemy import MetaData, orm, schema
from   sqlalchemy.types  import Integer, String
from   sqlalchemy.schema import Column, Sequence, ForeignKey
import sqlalchemy as sa
from   sqlalchemy.orm import sessionmaker, relation
from   sqlalchemy.ext.declarative import declarative_base

engine   = sa.create_engine( 'sqlite://' )
metadata = MetaData(   )
Base     = declarative_base( metadata = metadata )
Session  = sessionmaker(  )
Session.configure( bind = engine )

def create( ):
    Base.metadata.create_all( engine )

class Staff( Base ):
    __tablename__ = 'staff'
    id  = Column( Integer, Sequence( 'user_seq' ),
                  nullable=False, primary_key=True )
    name = Column( String, nullable=False )
    type = Column( String, nullable=False )
    __mapper_args__ = {'polymorphic_on': type }

class Manager( Staff ):
    __mapper_args__ = {'polymorphic_identity': 'manager'}
    Billables       = relation( 'BillableHours' )


class Contract( Base  ):
    __tablename__ = 'contract'
    id  = Column( Integer, Sequence( 'contract_seq' ),
                  nullable=False, primary_key=True )
    type = Column( String, nullable=False )
    __mapper_args__ = {'polymorphic_on': type }

class Peon( Contract ):
    __mapper_args__ = {'polymorphic_identity': 'peon'}
    StatusReports   = relation( 'StatusReport' )


class Payments( Base ):
    __tablename__ = 'payments'
    id  = Column( Integer, Sequence( 'payments_seq' ),
                  nullable=False, primary_key=True )
    type = Column( String,  nullable=False )
    __mapper_args__ = {'polymorphic_on': type }

class StatusReport( Payments ):
    __mapper_args__ = {'polymorphic_identity': 'status'}
    user = Column( Integer, ForeignKey('contract.id'),  nullable=False )
    job  = Column( String, nullable=False, default="offshore" )
    hrs  = Column( Integer, nullable=False, default=0 )
    Peons = relation( 'Peon' )

class BillableHours( Payments ):
    __mapper_args__ = {'polymorphic_identity': 'billable'}
    user = Column( Integer, ForeignKey('staff.id'),  nullable=False )
    job  = Column( String, nullable=False  )
    hrs  = Column( Integer, nullable=False, default=8 )
    Managers = relation( 'Manager' )
--------------------------------------------------------------

Thanks.

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