On Feb 14, 2014, at 12:46 PM, Michael Hipp <[email protected]> wrote:
> On 2/13/2014 11:45 AM, Michael Bayer wrote:
>> So for "children" above you need to spell out primaryjoin completely which
>> is primaryjoin="and_(Animal.sire_id == Animal.id_, Animal.dam_id ==
>> Animal.id)".
>
> Thought I was on the right track but now getting the exception below. Here's
> the model:
>
> class Animal(Base):
> __tablename__ = 'animals'
> id_ = Column(Integer, primary_key=True)
>
> sire_id = Column(Integer, ForeignKey('animals.id_'))
> dam_id = Column(Integer, ForeignKey('animals.id_'))
>
> sire = relationship('Animal', foreign_keys=[sire_id])
> dam = relationship('Animal', foreign_keys=[dam_id])
> pjoin = 'and_(Animal.sire_id == Animal.id_, Animal.dam_id == Animal.id_)'
> children = relationship('Animal', foreign_keys=[sire_id, dam_id],
> primaryjoin=pjoin)
>
> So I attempt to put in the first object, which is to be a bit special:
>
> unknown = Animal(id_=0)
> db_session.add(unknown)
> unknown.sire = unknown # <- get exception here
> unknown.dam = unknown
> db_session.commit()
>
> TypeError: Incompatible collection type: Animal is not list-like
>
> unknown.sire shows to contain [] so it evidently wants a list of sires?
> That's not what I had in mind for the above model. Any help?
well here we’re doing a self-referential relationship so in order to make a
many-to-one self ref, as someone else mentioned you need remote_side=sire_id
background:
http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#adjacency-list-relationships
signature.asc
Description: Message signed with OpenPGP using GPGMail
