2011-01-13 38 views
8

mới với SQLAlchemy, đây là vấn đề của tôi:số nhiều nhiều bảng tham gia với SQLAlchemy

mô hình của tôi là:

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)) 

Vì vậy, mã này phản ánh mối quan hệ sau:

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

Tôi đã cố gắng làm việc với các cuộc tham gia nhưng vẫn không thành công khi thực hiện những việc sau:

Một yêu cầu SQLAlchemy để có được tất cả những người sử dụng các trường hợp khi biết một tên Lãnh thổ hải (giả sử 'R & D ")

này nên bắt đầu với:

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

Bất cứ ai có thể giúp đỡ?

Cảm ơn thời gian của bạn,

Pierre

Trả lời

1

Tại sao bạn không tạo ra một table relationships?

Sau khi thực hiện nó, để có được mong muốn của bạn:

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

nơi .departments thuộc tính sẽ là một tài sản để mối quan hệ của bạn.

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

cũng trình này, nhưng sử dụng một phụ chọn:

session.query(User).join((Group, User.groups)) \ 
    .filter(Group.departments.any(Department.name == 'R&D')) 
Các vấn đề liên quan