Hi everyone,

Does anyone have a good setup for one-to-one relationships that are
always symmetric and provide a common property to access the paired
object?  Ie, it's always the case that:
        1) (x,y) is in the relation iff (y,x) is in the relation.
        2) x.peer = y
        3) y.peer = x

Here's the best thing I've come up with so far.  It's not perfect -
for instance, there's no way to query by partner.

class Person(object):
    def _get_partner(self):
        if self.marriage:
            return self.marriage.get_partner_of(self)
        else:
            return None
    partner = property(_get_partner)

class Marriage(object):
    def __init__(self, a, b):
        self.partners = [a, b]
    def get_partner_of(self, a):
        x = list(self.partners)
        x.remove(a)
        return x[0]

person_t = Table('person', metadata,
                 Column('id', Integer, primary_key=True),
                 Column('marriageid', Integer, ForeignKey('marriage.id')))
marriage_t = Table('marriage', metadata,
                   Column('id', Integer, primary_key=True))

person_m = orm.mapper(Person, person_t)
marriage_m = orm.mapper(Marriage, marriage_t,
                        properties={'partners': orm.relation(Person, 
backref="marriage")})


Ross


-- 
Ross Vandegrift
r...@kallisti.us

"If the fight gets hot, the songs get hotter.  If the going gets tough,
the songs get tougher."
        --Woody Guthrie

Attachment: signature.asc
Description: Digital signature

Reply via email to