I created a stripped version of my application's model and I found the
problem. The problem is not in the polymorphism but int the inheritance
condition. I have cycles in my model so I had to use the
inherit_condition. I found that it is a big difference how I choose the
expression sides

inherit_condition=derived.c.id==base.c.id

or

inherit_condition=base.c.id==derived.c.id

But why? Is my inherit_condition incorrect at all?

The example code is attached.



Michael Bayer napsal(a):
> 
> On Aug 25, 2008, at 1:05 PM, ml wrote:
> 
>> One more thing :-)
>>
>> Now I have polymorphic_fetch="deferred" and in some needed cases I  
>> call
>> query.with_polymorphic("*"). All works perfectly. But can I setup
>> something like with_polymorphic("*") on a mapper property? Because now
>> all relations to Base are polymorphic-deferred and it does me some  
>> troubles.
> 
> not really.  What kind of problems ?
> 
> 
> > 
> 

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
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
-~----------~----~----~----~------~----~------~--~---

#!/usr/bin/python
# -*- coding: utf-8 -*-

from sqlalchemy import *
from sqlalchemy.orm import *

#engine = create_engine("postgres://localhost/test", echo=True)
engine = create_engine("sqlite://", echo=True)

metadata = MetaData()

base = Table("base", metadata, 
    Column("id", Integer, primary_key=True),
    Column("id_parent", Integer, ForeignKey("base.id")),
    Column("kind", Integer),
)

derived = Table("derived", metadata, 
    Column("id", Integer, ForeignKey("base.id"), primary_key=True),
    Column("x", Integer),
    Column("id_other", Integer),
    ForeignKeyConstraint(["id_other"], ["base.id"], 
                          "other_fg", use_alter=True),
)

class Base(object):
    def __init__(self, id, parent):
        self.id = id
        self.parent = parent

class Derived(Base):
    def __init__(self, id, parent):
        Base.__init__(self, id, parent)
        self.x = id

mapper(Base, base,
    polymorphic_on=base.c.kind,
    polymorphic_identity=0,
    polymorphic_fetch="deferred",
    properties = {
      "children": relation(Base, cascade="all",
        backref=backref("parent", remote_side=[base.c.id])),
    }
  )

mapper(Derived, derived,
    inherits=Base,
    #inherit_condition=base.c.id==derived.c.id,
    inherit_condition=derived.c.id==base.c.id,
    polymorphic_identity=1,
    properties = {
      "other": relation(Base, cascade="all", post_update=True,
          primaryjoin=derived.c.id_other==base.c.id)
    }
  )

metadata.drop_all(engine)
metadata.create_all(engine)

Session = sessionmaker(bind=engine, autoflush=False, transactional=False)
session = Session()

#################################
# test data - chain 1<-2<-3

session.save(Derived(3, Derived(2, Derived(1, None))))
session.save(Derived(6, Derived(5, Derived(4, None))))
session.flush()
session.clear()

#################################

q = session.query(Base).with_polymorphic("*").get(3)
assert q.parent.parent.x == 1
q = session.query(Base).with_polymorphic("*").get(6)
assert q.parent.parent.x == 4, q.parent.parent.x

Reply via email to