back_populate solves this.
Full Example:
from sqlalchemy import create_engine, Column, ForeignKey, Integerfrom
sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import
relationship, sessionmaker
Base = declarative_base()
## Modelclass Parent(Base):
__tablename__ = 'parents'
id = Column(Integer(), primary_key=True, autoincrement=True)
childs = relationship("Child", primaryjoin="or_(Child.father_id==Parent.id,
Child.mother_id==Parent.id)")
class Child(Base):
__tablename__ = 'children'
id = Column(Integer(), primary_key=True, autoincrement=True)
father_id = Column(Integer(), ForeignKey('parents.id'))
mother_id = Column(Integer(), ForeignKey('parents.id'))
father = relationship("Parent", foreign_keys=[father_id],
back_populates="childs")
mother = relationship("Parent", foreign_keys=[mother_id],
back_populates="childs")
engine = create_engine('sqlite:///sqlite.db')
Base.metadata.create_all(engine)
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine, autoflush=False, autocommit=False,
expire_on_commit=False)
session = DBSession()
## Test Code
father = Parent()assert len(father.childs) == 0 # SUCCESS
mother = Parent()
c1 = Child(father=father, mother=mother)assert c1.father is father
# SUCCESSassert c1.mother is mother # SUCCESS
session.add_all([father, mother, c1])
session.commit()
# Using refresh solves the assertion#session.refresh(father)assert
len(father.childs) > 0 # SUCCESSassert father.childs == [c1] #
SUCCESSassert mother.childs == [c1] # SUCCESS
On Thursday, September 17, 2015 at 8:43:51 PM UTC+3, Jonathan Vanasco wrote:
>
> Immediately I notice that the attributes `father`/`mother` have no
> relationship to the `Parent` object. I think specifying
> backref/back_populates should solve your issue:
> http://docs.sqlalchemy.org/en/rel_1_0/orm/backref.html
>
>
> Also, FYI
>
> You can use `expire` on just the relationships (
> http://docs.sqlalchemy.org/en/rel_1_0/orm/session_api.html#sqlalchemy.orm.session.Session.expire
> )
>
> session.expire(father, ['childs',])
>
>
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.