Отношение «многие ко многим» в одной таблице с объектом ассоциации - PullRequest
4 голосов
/ 15 июня 2010

Связано (для случая использования объекта без ассоциации): SQLAlchemy Отношение «многие ко многим» в одной таблице

Построить отношение «многие ко многим» легко.Построить отношение «многие ко многим» на одной и той же таблице почти так же просто, как описано в приведенном выше вопросе.

Построить отношение «многие ко многим» с объектом ассоциации также просто.

То, что я не могу найти, - это правильный способ объединить объекты ассоциации и отношения «многие ко многим» с левой и правой сторонами, являющимися одной и той же таблицей.

Итак, начиная с простого, наивногои явно неправильная версия, которую я потратил навсегда, пытаясь втиснуть в правильную версию:

t_groups = Table('groups', metadata,
    Column('id', Integer, primary_key=True),
)

t_group_groups = Table('group_groups', metadata,
    Column('parent_group_id', Integer, ForeignKey('groups.id'), primary_key=True, nullable=False),
    Column('child_group_id', Integer, ForeignKey('groups.id'), primary_key=True, nullable=False),
    Column('expires', DateTime),
)

mapper(Group_To_Group, t_group_groups, properties={
    'parent_group':relationship(Group),
    'child_group':relationship(Group),
})

Каков правильный способ отобразить эти отношения?

1 Ответ

6 голосов
/ 15 июня 2010

Полагаю, вы получаете сообщение об ошибке типа Could not determine join condition between parent/child tables... В этом случае измените маппер для Group_To_Group на следующее:

mapper(Group_To_Group, t_group_groups, properties={
    'parent_group':relationship(Group,
        primaryjoin=(t_group_groups.c.parent_group_id==t_groups.c.id),),
    'child_group':relationship(Group,
        primaryjoin=(t_group_groups.c.child_group_id==t_groups.c.id),),
})

также вы можете добавить backref, чтобы вы могли перемещаться по отношениям и из Group объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...