Postgresql 返回一个";计算的;SQLAlchemy中查询中的列

Postgresql 返回一个";计算的;SQLAlchemy中查询中的列,postgresql,sqlalchemy,flask-sqlalchemy,Postgresql,Sqlalchemy,Flask Sqlalchemy,假设我有以下课程: class Basket(db.Model): id = Column('id', Integer, primary_key=True) class Fruit(db.Model): id = Column('id', Integer, primary_key=True) basket_id = Column(Integer, ForeignKey('basket.id')) 我想在水果表上进行查询,如果水果的篮子id在篮子id的列表中[1,2,3

假设我有以下课程:

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

class Fruit(db.Model):
    id = Column('id', Integer, primary_key=True)
    basket_id = Column(Integer, ForeignKey('basket.id'))
我想在
水果
表上进行查询,如果水果的
篮子id
在篮子id的列表中
[1,2,3]
则在其结果中返回一个名为
in_basket
的“计算”列,即

在炼金术中有没有办法做到这一点?我在用炼金术和博士后9


谢谢。

使用表达式时应简单明了:

class Fruit(...):
    ...
    def is_in_basket(self, busket_list):
        return self.basket_id in busket_list

def get_fruits(basket_list):
    from sqlalchemy.sql.expression import case
    xpr = case([(Fruit.basket_id.in_(basket_list), True),], else_ = False).label("in_basket")
    qry = session.query(Fruit, xpr)
    fruits = []
    for fruit, in_basket in qry:
        fruit.in_basket = in_basket # assign value to a Fruit property (as per comment below)
        fruits.append(fruit)
    return fruits

fruits = get_fruits(my_basket_list)
for f in fruits:
    print f, f.in_basket, f.is_in_basket(my_basket_list)

非常感谢你。这看起来很有趣。我如何定义一个关于水果的列,以便Fruits.query始终返回一个名为Fruit.in_basket的计算列?(不过,由于basket_列表是动态的,所以在运行查询时,列定义需要查找basket_列表。)老实说,我不明白这样做的目的。查询
水果
对象时,您可以在
in_basket
上进行筛选。但是,如果内存中已经有对象,则
in_basket
只是
def in_basket(self,blist):返回blist中的self.basket\u id
。此外,没有任何东西阻止您对查询进行后期处理,并在循环中执行
fruit.in_basket=in_basket
(请参见上文-更新答案)谢谢。我知道@property(例如,您的in_basket方法),但将其设置为“虚拟”(计算)字段迫使我在其他地方添加逻辑。我想知道是否有可能在数据库本身中轻松实现这一点。嗯,def get_fruits(…)就是这样做的:在数据库上进行计算。事实上,你的吊篮ID是完全外部的,这不允许你按照自己的意愿去做。。。无论如何,如果你找到更好的解决方案,请分享。谢谢