在联接上具有过滤器的Python SqlAlchemy模型实例返回None类型

时间:2019-10-21 13:17:01

标签: python database sqlalchemy flask-sqlalchemy

我的问题是要从多对多表中获取模型实例,并通过table1.id和table2.some_field对其进行过滤,作为子查询或第二个过滤器。

例如,我有类似的模型:

if

基于该代码

elseif

我收到了assoc = db.Table('table1_table2', db.Column('table1_id', db.Integer, db.ForeignKey('table1.id')), db.Column('table2_id', db.Integer, db.ForeignKey('table2.id'))) class Table1(db.Models): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) class Table2(db.Models): id = db.Column(db.Integer, primary_key=True) some_field = db.Column(db.Boolean) table1 = db.relationship('Table1', secondary=table1_table2) 模型实例,但是当 instance = db.session.query(Table1).\ join(Table1.table1).\ options(contains_eager(Table1.table1)).\ filter(Table1.name == some_value).\ filter(Table2.somefield == True).\ first() (空的Table2表)时,我收到了Table1对象。在我的情况下,如何接收no relation occurs以使延迟加载工作正常?

编辑: 我这样改变了我的sqlalchemy查询:

None

此查询的结果更接近我的期望-当没有关系时,它返回空列表,但是当有多个关系时,它返回所有关系,并在联接条件下进行过滤。

预期结果:

instance.table2 == []

代替:

instance = db.session.query(Table1). \
        outerjoin(table1_table2). \
        outerjoin(Table2, and_(Table2.id == table1_table2.c.table2_id, Table2.some_field = True)). \
        filter(Table1.name == some_value). \
        first()

Edit2: 经过一些编辑后,我的最终查询如下:

>>>instance.table2

[<Table2 {id}:True>, <Table2 {id}:True>]

0 个答案:

没有答案