Flask-SQLAlchemy объединяются в 3 модели и конструкцию таблицы

У меня 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')) ) 

Я хочу иметь возможность получить всех Customers для SalesManager , а это означает, что все клиенты, у которых есть statemented_branch_id в любом из Branch SalesManager.branches отношениями SalesManager.branches .

Мой запрос выглядит примерно так:

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

Что явно не так.

Как я могу получить всех Customers для SalesManager ?

Обновить

Когда я пытаюсь:

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

2 Solutions collect form web for “Flask-SQLAlchemy объединяются в 3 модели и конструкцию таблицы”

Мне нужно было добавить SalesManager в мою модель SalesManager которая позволяет SQLAlchemy выяснить, как получить от SalesManager к ветви.

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

Пытаться:

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

Возможно, вам нужно будет предоставить явные сведения on параметрах, используя второй аргумент для join , или вам может потребоваться явно добавить таблицу сопоставления, но в любом случае то, что вы пытаетесь сделать, следующее:

 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 
  • Почему загрузка объектов SQLAlchemy через ORM 5-8x медленнее, чем строки через необработанный курсор MySQLdb?
  • Как удалить строки из таблицы с помощью запроса SQLAlchemy без ORM?
  • как выбрать только некоторые столбцы в SQLAlchemy?
  • Как отключить кеширование SQLAlchemy?
  • SqlAlchemy и многопроцессорность
  • Начальный вопрос об объявлении стиля SQLAlchemy ()
  • Группировать по часам в SQLAlchemy?
  • Время соединения Sql Alchemy Out
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.