2013-07-23 4 views
6

を構築し、私は3つのモデルがあります:フラスコSQLAlchemyのは3つのモデル間で参加して、表が

class Customer(Model): 
    __tablename__ = 'customer' 

    id = Column(Integer, primary_key=True) 
    statemented_branch_id = Column(Integer, ForeignKey('branch')) 
    ... 

class Branch(Model): 
    __tablename__ = 'branch' 

    id = Column(Integer, primary_key=True) 
    ... 

class SalesManager(Model): 
    __tablename__ = 'sales_manager' 

    id = Column(Integer, primary_key=True) 
    branches = relationship('Branch', secondary=sales_manager_branches) 

とテーブル構造:

sales_manager_branches = db.Table(
    'sales_manager_branches', 
    Column('branch_id', Integer, ForeignKey('branch.id')), 
    Column('sales_manager_id', Integer, ForeignKey('sales_manager.id')) 
) 

を私はSalesManagerのすべてのCustomersを取得できるようにしたいです、SalesManager.branches関係Branch ESのいずれかにstatemented_branch_idを持っているすべての顧客を意味しています。

branch_alias = aliased(Branch) 
custs = Customer.query.join(branch_alias, SalesManager.branches).\ 
     filter(Customer.statemented_branch_id == branch_alias.id) 

明らかに適切ではない。

私のクエリは、このような少し何かを探しています。

はどのようSalesManagerのすべてのCustomersを得ることができますか?

更新

私は試してみてください。

Customer.query.\ 
     join(Branch).\ 
     join(SalesManager.branches).\ 
     filter(SalesManager.id == 1).all() 

私はOperationalError取得:

*** OperationalError: (OperationalError) ambiguous column name: branch.id u'SELECT 
customer.id AS customer_id, customer.statemented_branch_id AS 
customer_statemented_branch_id \nFROM customer JOIN branch ON branch.id 
customer.statemented_branch_id, "SalesManager" JOIN sales_manager_branches AS 
sales_manager_branches_1 ON "SalesManager".id = sales_manager_branches_1.sdm_id JOIN 
branch ON branch.id = sales_manager_branches_1.branch_id \nWHERE "SalesManager".id = ?' 
(1,) 
+3

をSQLAlchemyのは二回SQLに 'branch'テーブルを入れているようあなたがこの場合に参加するためにあなたはaliased'' 'Branch'する必要があります、エイリアスなしで両方の時間。 –

+0

おかげショーン、私は以下の私の答えのようにそれをやってしまいました。私はあなたの答え/コメントに投票しましたが、できる限り私は自分自身を受け入れます。 –

答えて

7

私が必要SQLAlchemyのブランチにSalesManagerから取得する方法を見つけ出すことができます私のSalesManagerモデルにbackrefを追加します。

class SalesManager(Model): 
    __tablename__ = 'sales_manager' 

    id = Column(Integer, primary_key=True) 
    branches = relationship(
     'Branch', secondary=sales_manager_branches, backref="salesmanagers") 

そして、このようなクエリ構築:

Customer.query.\ 
     join(Branch).\ 
     join(Branch.salesmanagers).\ 
     filter(SalesManager.id == 1).all() 
1

試してみてください。

SalesManager.query \ 
      .join(Branch) \ 
      .join(Customer) \ 
      .filter(SalesManager.id == 123) 

あなたは、NEことをedはjoinに2つ目の引数を経て、明示的なonのparamsを提供するために、または明示的にマッピングテーブルを追加する必要があるかもしれません - しかし、あなたがやろうとしているかのいずれかの場合には以下の通りです:

SELECT SM.* 
FROM sales_manager SM 
JOIN sales_manager_branches SMB 
    ON SM.id = SMB.sales_manager_id 
JOIN branch B 
    ON SMB.branch_id = B.id 
JOIN customer C 
    ON B.id = C.statemented_branch_id 
WHERE -- Conditions go here 
+0

これは右、 'SalesManager'sのリストを返しますか?私は '顧客'のリストが欲しい。あなたの答えのための –

+0

おかげで、私はこれをしようとすると何が起こっているかを上記の私の質問を更新しました。 –

関連する問題