Python 3.x 烧瓶中的多对多过滤器

Python 3.x 烧瓶中的多对多过滤器,python-3.x,flask,sqlalchemy,flask-sqlalchemy,Python 3.x,Flask,Sqlalchemy,Flask Sqlalchemy,使用SQLAlchemy 1.3.23、Flask SQLAlchemy Flask SQLAlchemy和PostgreSQL 13.2,我得到了一个多对多关系: class PositionsModel(db.Model): __tablename__ = "positions" id = db.Column(db.Integer, primary_key=True) position_name = db.Column(db.String(150), nu

使用SQLAlchemy 1.3.23、Flask SQLAlchemy Flask SQLAlchemy和PostgreSQL 13.2,我得到了一个多对多关系:

class PositionsModel(db.Model):

  __tablename__ = "positions"

  id = db.Column(db.Integer, primary_key=True)
  position_name = db.Column(db.String(150), nullable=False)

  types_of_work = db.relationship(
    "TypesOfWorkModel",
    secondary=positions_types_of_work,
    lazy="joined",
    backref=db.backref("type_positions", lazy="noload")
  )

class TypesOfWorkModel(db.Model):

  __tablename__ = "types_of_work"

  id = db.Column(db.Integer, primary_key=True)
  work_type_name = db.Column(db.String(150), nullable=False)


positions_types_of_work = db.Table(
  "positions_types_of_work",
  db.Column("position_id", db.Integer, db.ForeignKey("positions.id"), primary_key=True),
  db.Column("type_of_work_id", db.Integer, 
            db.ForeignKey("types_of_work.id"), primary_key=True)
)
其中,
positions\u types\u of\u work
是从“positions”中查找“type\u of\u work”的第三个表

我需要能够通过
工作类型
过滤数据,因此我最终得到了以下查询:

data = PositionsModel.query
data = data.join(positions_types_of_work).join(TypesOfWorkModel).filter(
  TypesOfWorkModel.id.in_(kwargs["types_of_work"])
)

return data.paginate(10, 25, False).items
这一切都是可行的,但我注意到结果SQL很奇怪:

SELECT
    positions.id AS positions_id,
    positions.position_name AS positions_position_name,
    types_of_work_1.id AS types_of_work_1_id,
    types_of_work_1.work_type_name AS types_of_work_1_work_type_name
FROM positions

JOIN positions_types_of_work ON positions.id = positions_types_of_work.position_id
JOIN types_of_work ON types_of_work.id = positions_types_of_work.type_of_work_id
LEFT OUTER JOIN (
    positions_types_of_work AS positions_types_of_work_1
    JOIN types_of_work AS types_of_work_1 ON types_of_work_1.id = positions_types_of_work_1.type_of_work_id
) ON positions.id = positions_types_of_work_1.position_id
WHERE types_of_work.id IN (%(id_1)s, %(id_2)s)
我确实期望前两个连接,但我不明白为什么我离开了外部连接?也许最终我运行了一个错误的炼金术查询,应该以某种方式进行更改