2013-07-23 8 views
6

inşa:Flask-SQLAlchemy 3 modeller arasında katılıp bir Tablo I 3 modelleri var

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) 

Ve Tablo yapısı: Bir SalesManager için tüm Customers elde edebilmek istiyorum

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

Bu, Branch'un herhangi birindeki statemented_branch_id numaralı tüm Müşterilerin SalesManager.branches ilişkisini ifade ettiği anlamına gelir.

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

besbelli doğru değildir:

Benim sorgu böyle küçük bir şey arıyor.

SalesManager için tüm Customers'u nasıl alabilirim?

Güncelleme

Ben çalıştığınızda:

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

Sen aliased'' Branch' 'gerekir ve her iki takma ad olmadan. –

+0

Teşekkürler Sean, aşağıdaki cevabımda yaptığım gibi bitirdim. Cevabınızı/yorumlarınızı yükselttim, ancak elimden geldiğince kendimi kabul edeceğim. –

cevap

7

ben gerekiyordu backref, SalesManager modeline, SalesManager şubesine nasıl ulaşılacağını öğrenmesini sağlayan bir backref modeli ekleyin.

class SalesManager(Model): 
    __tablename__ = 'sales_manager' 

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

Ve böyle sorgu oluşturmak: Bu durumda katılmak için SQLAlchemy iki kez SQL içine `branch` tablo koyuyor olarak

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

Dene:

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

Sen NE olabilir

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

Bir OperationalError olsun ed join ikinci argüman yoluyla, açık on params sağlamak için, veya açıkça eşleştirme tablo eklemek gerekebilir - ama yapmaya çalışıyorsun ne iki durumda da şudur:

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

Bu, SalesManager'ın bir listesini döndürecek, değil mi? Müşteri 'nin bir listesini istiyorum. –

+0

Cevabınız için teşekkürler, bunu denediğimde yukarıdaki sorularımı güncelledim. –