Flask sqlalchemy. Фильтрация данных в таблице бд, в которой имеется несколько связей на одну и ту же таблицу

Имею модель таблицы пользователей:

class users(db.Model):
    __tablename__ = 'users'
    __table_args__ = {'schema': '123'}

    id = db.Column(name="id", type_=db.Integer, primary_key=True, autoincrement=True)
    user_name = db.Column(name="user_name", type_=db.String(45))
    user_role_id = db.Column("user_role_id", db.Integer, db.ForeignKey('viepp_online.users_roles.id'))
    user_role = db.relationship("users_roles")
    login = db.Column(name="login", type_=db.String(256))
    password = db.Column(name="password", type_=db.String(100))
    delete = db.Column(name="delete", type_=db.LargeBinary)
    sex_id = db.Column(name="sex_id", type_=db.Integer)
    first_name_nominative = db.Column(name="first_name_nominative", type_=db.String(45))
    last_name_nominative = db.Column(name="last_name_nominative", type_=db.String(45))
    second_name_nominative = db.Column(name="second_name_nominative", type_=db.String(45))
    first_name_genitive = db.Column(name="first_name_genitive", type_=db.String(45))
    last_name_genitive = db.Column(name="last_name_genitive", type_=db.String(45))
    second_name_genitive = db.Column(name="second_name_genitive", type_=db.String(45))
    first_name_dative = db.Column(name="first_name_dative", type_=db.String(45))
    last_name_dative = db.Column(name="last_name_dative", type_=db.String(45))
    second_name_dative = db.Column(name="second_name_dative", type_=db.String(45))
    user_password = db.Column(name="user_password", type_=db.String)

Модель таблицы заявления:

class statements(db.Model):
    __tablename__ = 'statements'
    __table_args__ = {'schema': '123'}

    id = db.Column(name="id", type_=db.Integer, primary_key=True, autoincrement=True)
    reg_number = db.Column("reg_number", db.String)
    user_id = db.Column("user_id", db.Integer , db.ForeignKey('viepp_online.users.id'))
    user = db.relationship("users", foreign_keys=[user_id])
    create_user = db.Column("create_user", db.Integer , db.ForeignKey('viepp_online.users.id'))
    cr_user = db.relationship("users", foreign_keys=[create_user])
    statement_type_id = db.Column("statement_type_id", db.Integer , db.ForeignKey('viepp_online.statements_types.id'))
    statement_type = db.relationship("statements_types", foreign_keys=[statement_type_id])
    data = db.Column(name="data", type_=db.JSON)
    xml_data = db.Column(name="xml_data", type_=db.String)
    create_date = db.Column(name="create_date", type_=db.DateTime)
    statement_par_id = db.Column(name="statement_par_id", type_=db.Integer)

Пытаюсь выполнить следующий запрос:

db.session.query(statements).join(users, users.id == statements.user_id).filter(users.user_name.like("%Петров%")).join(users, users.id == statements.create_user).filter(users.user_name.like("%Сидоров%")).all()

Кидается исключение:

(pymysql.err.OperationalError) (1066, "Not unique table/alias...

Как правильно мне отсортировать данные в таблице заявлений (statements) по двум пользователям? Стек: python3, flask, sqlalchemy


Ответы (1 шт):

Автор решения: Roman Konoval

Пользуйтесь aliased:

usersId = aliased(users)
usersCreate = aliased(users)

db.session.query(statements)\
  .join(usersId, statements.user_id)\
  .filter(usersId.user_name.like("%Петров%"))\
  .join(usersCreate, statements.create_user)\
  .filter(usersCreate.user_name.like("%Сидоров%"))\
  .all()
→ Ссылка