2011-01-13 1 views
8

Новое с SQLAlchemy, вот моя проблема:Несколько многие ко многим соединения таблиц с SQLAlchemy

Моя модель:

user_group_association_table = Table('user_group_association', Base.metadata, 
    Column('user_id', Integer, ForeignKey('user.id')), 
    Column('group_id', Integer, ForeignKey('group.id'))  
) 

department_group_association_table = Table('department_group_association', Base.metadata, 
    Column('department', Integer, ForeignKey('department.id')), 
    Column('group_id', Integer, ForeignKey('group.id')) 
) 

class Department(Base): 
    __tablename__ = 'department' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 


class Group(Base): 
    __tablename__ = 'group' 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    users = relationship("User", secondary=user_group_association_table, backref="groups") 
    departments = relationship("Department", secondary=department_group_association_table, backref="groups") 

class User(Base): 

    __tablename__ = 'user' 
    id = Column(Integer, primary_key=True) 
    firstname = Column(String(50)) 
    surname = Column(String(50)) 

Таким образом, этот код отражает следующие соотношения:

--------    ---------    -------------- 
    | User | --- N:M --- | Group | --- N:M --- | Department | 
    --------    ---------    -------------- 

Я попытался работать с соединениями, но все еще не удалось выполнить следующие действия:

Один запрос SQLAlchemy, чтобы получить все пользователи экземпляров, зная имя Département (скажем, «R & D")

Это должно начинаться с:

session.query(User).join(... 
or 
session.query(User).options(joinedLoad(... 

Любой может помочь?

Спасибо за ваше время,

Пьер

ответ

1

Почему бы вам не создать table relationships?

После его реализации, чтобы получить нужные вам:

list_of_rnd_users = [u for u in Users if 'R&D' in u.departments] 

где атрибут .departments бы свойство для ваших отношений.

21
session.query(User).join((Group, User.groups)) \ 
    .join((Department, Group.departments)).filter(Department.name == 'R&D') 

Это также работает, но использует суб-выбора:

session.query(User).join((Group, User.groups)) \ 
    .filter(Group.departments.any(Department.name == 'R&D')) 
Смежные вопросы