Sqlalchemy 按查询输出列排序
我将graphene与sqlalchemy一起使用,我有一个包含计算字段的输出对象。字段是根据某些输入(查询)参数计算的,并且或多或少是这样的(为了简化,让我考虑一下,我在计算f(x)=Ax+b,其中A和B都是我的两列)。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
东西
表格):
导入模型
类对象(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文档的这一部分提供了更多详细信息和需要注意的事项列表:。这也是我的问题。问题是,我们无法从顶层访问在较低层生成的数据。这也是我的问题。问题是,我们无法从顶层访问在较低层生成的数据。