所以我有桌子,我想让用户能够以他们喜欢的顺序查看表格。这是一个例子:
class Thing(Base):
__tablename__ = 'thing'
id = Column(Integer, primary_key=True)
amount = Column(Integer)
date = Column(DateTime, default=datetime.now())
def __init__(self, amount):
self.amount = amount
所以我想提出以下问题:
if sort == 'amount':
orderby = Thing.amount.desc()
elif sort == 'date':
orderby = Thing.date.desc()
things = DBSession.query(Thing).order_by(orderby).all()
主要问题:
我可以使用过滤器进行类似的操作吗?
filterby = Thing.amount == 5
things = DBSession.query(Thing).filter_by(filterby).all()
谢谢!
答案 0 :(得分:3)
答案1: 当您提供任何语法时,它将返回什么样的语法,您可以检查该语法的类型,如
写作时
In [5]: Thing.amount.desc()
Out[5]: <sqlalchemy.sql.expression._UnaryExpression object at 0x199a5d0>
它将创建一个Expression._UnaryExpression类型的对象。所以当我们想要一元操作时,你可以给sqlalchemy这个表达式。现在当你打印它 在[6]中:a = Thing.amount.desc()
In [7]: print a
thing.amount DESC
因此,当查询运行时,它将在thing.amount DESC
中转换。因此,当你创建表达式时,它不会调用任何东西,它只会创建查询结构。
答案:2
在创建查询时,它将创建所需的对象。对于过滤器和顺序,需要表达式,所以如果直接传递给order_by
或filter
,那么它将在内部为它创建对象。所以你可以两种方式使用。
答案:3
In [8]: Thing.amount == 5
Out[8]: <sqlalchemy.sql.expression._BinaryExpression object at 0x1a1dbd0>
这也是一个表达式,因此您可以将表达式赋予filter_by。
您将从sqlalchemy网站了解expression。