Самореференциальное соединение sqlalchemy с содержит нетерпеливый - PullRequest
0 голосов
/ 07 мая 2020

Попытка выполнить самореферентное соединение, которое загружает только определенные экземпляры отношения на «дочерний» узел. Я пытаюсь выполнить sh это с помощью contains eager. Однако, когда я добавляю в запрос, он фильтрует столбец «дочерних» отношений до одного экземпляра, даже если их несколько, соответствующих критериям. См. Пример ниже, где я получаю разные результаты, просто используя contains_eager

class User(db.Model):
  id = db.Column(db.Integer, primary_key=True)

class Manager(db.Model):
      id = db.Column(db.Integer, primary_key=True)
      user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
      location = db.Column(db.String())
      same_managers = db.relationship(
        "Manager",
        primaryjoin=db.and_(db.remote(user_id) == db.foreign(user_id), db.remote(id) != db.foreign(id)),
        uselist=True,
    )

manager_alias = db.aliased(Manager)

managers = (
    db.session.query(Manager).outerjoin((manager_alias, Manager.same_managers))
    .filter(manager_alias.location == 'CA')
    .options(db.contains_eager(Manager.same_managers.of_type(manager_alias)))
).first()

managers.same_managers == [Manager2] // should be multiple managers.

managers = (
    db.session.query(Manager).outerjoin((manager_alias, Manager.same_managers))
    .filter(manager_alias.location == 'CA')
).first()

managers.same_managers == [Manager2, Manager3, Manager4]
...