Sqlalchemy 按查询输出列排序

Sqlalchemy 按查询输出列排序,sqlalchemy,graphene-python,graphene-sqlalchemy,Sqlalchemy,Graphene Python,Graphene Sqlalchemy,我将graphene与sqlalchemy一起使用,我有一个包含计算字段的输出对象。字段是根据某些输入(查询)参数计算的,并且或多或少是这样的(为了简化,让我考虑一下,我在计算f(x)=Ax+b,其中A和B都是我的两列)。 东西表格): 导入模型 类对象(SQLAlchemyObjectType): 类元: 模型 接口=(relay.Node,) f=graphene.Field(graphene.Float) def解析(自我,信息): 返回self.a*info.context['x']+s

我将graphene与sqlalchemy一起使用,我有一个包含计算字段的输出对象。字段是根据某些输入(查询)参数计算的,并且或多或少是这样的(为了简化,让我考虑一下,我在计算f(x)=Ax+b,其中A和B都是我的两列)。
东西
表格):

导入模型
类对象(SQLAlchemyObjectType):
类元:
模型
接口=(relay.Node,)
f=graphene.Field(graphene.Float)
def解析(自我,信息):
返回self.a*info.context['x']+self.b
在我的查询中,我有以下内容,我想根据函数
f
的输出对字段进行排序:

类查询(graphene.ObjectType):
最佳点=graphene.List(lambda:Thing,x=graphene.Float())
def解析最佳点(自我、信息、x):
查询=事物。获取查询(信息)
返回query.all()
起初,我尝试在
resolve\u best\u points
中使用类似于
query.order\u by(“f”).all()
的方法进行排序,但徒劳无功,因为石墨烯似乎在解析器之外添加了这个字段(即
query.all()
只包含
a
b
,而不包含
f(a,b)

有没有办法以干净的方式实现这一点?在
东西中添加一些选项
?或者在解析器中获取输出值,然后进行排序?或者更丑陋的事情,比如添加一个中间件来对来自
resolve\u best\u points
的输出进行排序

什么是可能的,可能的解决方案的优点/缺点是什么


请注意,这与以下问题有些关联:,但这也有很大不同,因为这里我不希望仅基于数据库字段进行计算(当涉及变量时,当前的解决方案不起作用,如本示例中的
info.context['x']
).

您可以使用SQLAlchemy的
orm.with\u expression
orm.query\u expression
函数将特殊表达式应用于查询,然后在
ORDER\u BY
子句中使用它们

query\u表达式
属性添加到您的
对象
模型中

#models.py
从sqlalchemy导入浮点、整数、orm
类事物(基本):
__tablename_uuu='things'
id=列(整数,主键=True)
a=列(浮动)
b=列(浮动)
expr=orm.query\u表达式()
现在,您可以将
与_expression
一起使用,将任意SQL表达式传递给查询。
Thing
对象上的
expr
属性的值将是表达式的结果

#schema.py
进口石墨烯
从石墨烯进口继电器
从sqlalchemy.orm导入带有_表达式
从模型导入东西作为模型
类对象(SQLAlchemyObjectType):
类元:
模型
接口=(relay.Node,)
类查询(graphene.ObjectType)
最佳点=graphene.List(Thing,x=graphene.Float())
def解析最佳点(自我、信息、x):
expr=ThingModel.a*x+ThingModel.b
返回(
获取查询(信息)
.options(带_表达式(ThingModel.expr,expr))
.订购人(expr)
.all()
)

SQLAlchemy文档的这一部分提供了更多详细信息和需要注意的注意事项列表:。

您可以使用SQLAlchemy的
orm.with\u expression
orm.query\u expression
函数将特殊表达式应用于查询,然后在
ORDER\u BY
子句中使用它们

query\u表达式
属性添加到您的
对象
模型中

#models.py
从sqlalchemy导入浮点、整数、orm
类事物(基本):
__tablename_uuu='things'
id=列(整数,主键=True)
a=列(浮动)
b=列(浮动)
expr=orm.query\u表达式()
现在,您可以将
与_expression
一起使用,将任意SQL表达式传递给查询。
Thing
对象上的
expr
属性的值将是表达式的结果

#schema.py
进口石墨烯
从石墨烯进口继电器
从sqlalchemy.orm导入带有_表达式
从模型导入东西作为模型
类对象(SQLAlchemyObjectType):
类元:
模型
接口=(relay.Node,)
类查询(graphene.ObjectType)
最佳点=graphene.List(Thing,x=graphene.Float())
def解析最佳点(自我、信息、x):
expr=ThingModel.a*x+ThingModel.b
返回(
获取查询(信息)
.options(带_表达式(ThingModel.expr,expr))
.订购人(expr)
.all()
)

SQLAlchemy文档的这一部分提供了更多详细信息和需要注意的事项列表:。

这也是我的问题。问题是,我们无法从顶层访问在较低层生成的数据。这也是我的问题。问题是,我们无法从顶层访问在较低层生成的数据。