2013-07-23 8 views
6

ho 3 modelli:Flask-SQLAlchemy unirsi in 3 modelli e un tavolo da costruire

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) 

e un tavolo costrutto:

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

voglio essere in grado di ottenere tutti Customers per un SalesManager , il che significa che tutti i clienti che hanno un statemented_branch_id in una qualsiasi delle Branch la relazione SalesManager.branches.

La mia domanda è alla ricerca di qualcosa di un po 'come questo:

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

che ovviamente non è giusto.

Come posso ottenere tutto il Customers per un SalesManager?

Aggiornamento

Quando provo:

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

ottengo un 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

avrete bisogno di '' aliased' Branch' per si uniscono in questo caso come SQLAlchemy sta mettendo la tabella 'branch' in SQL due volte e entrambe le volte senza alias. –

+0

Grazie Sean, ho finito per farlo come nella mia risposta qui sotto. Ho votato la tua risposta/i commenti, ma accetterò il mio quando posso. –

risposta

7

avevo bisogno di aggiungi un backref al mio modello SalesManager che consente a SQLAlchemy di capire come ottenere da SalesManager alla filiale.

class SalesManager(Model): 
    __tablename__ = 'sales_manager' 

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

E costruire la query come questa:

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

Prova:

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

Si può NE Ed a fornire esplicite on params, tramite il secondo argomento di join, o potrebbe essere necessario aggiungere in modo esplicito la tabella di mapping in - ma in entrambi i casi ciò che si sta cercando di fare è la seguente:

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

Ciò restituirà un elenco di 'SalesManager's, giusto? Voglio una lista di 'Cliente'. –

+0

Grazie per la tua risposta, ho aggiornato la mia domanda sopra con quello che succede quando provo questo. –

Problemi correlati