我将石墨烯与 sqlalchemy 一起使用,并且我有一个包含计算字段的输出对象。该字段是根据一些输入(查询)参数计算的,或多或少看起来像这样(为了简化,让我们考虑我正在计算f(x)=ax+b其中a和b都是我的
Thing
表中的列):
import models
class Thing(SQLAlchemyObjectType):
class Meta:
model = models.Thing
interfaces = (relay.Node, )
f = graphene.Field(graphene.Float)
def resolve_f(self, info):
return self.a * info.context['x'] + self.b
在我的查询中,我有以下内容,我想根据函数的输出对字段进行排序f
:
class Query(graphene.ObjectType):
best_points = graphene.List(lambda: Thing, x = graphene.Float())
def resolve_best_points(self, info, x):
query = Thing.get_query(info)
return query.all()
起初我尝试使用类似但徒劳的resolve_best_points
东西进行排序,因为石墨烯似乎在解析器之外添加了这个字段(即,只包含而不是)。query.order_by("f").all()
query.all()
a
b
f(a, b)
有没有办法以干净的方式实现这一目标?添加一些选项Thing
?或者也许在解析器中获取输出值然后排序?或者有点丑陋的东西,比如添加一个中间件来对输出进行排序resolve_best_points
?
什么是可能的,可能的解决方案的优点/缺点是什么?
请注意,这与以下问题有些相关:Sqlalchemy order by computed columninfo.context['x']
,但这也有很大不同,因为在这里我不希望仅基于数据库字段进行计算(当前解决方案在涉及变量时不起作用,例如这个玩具示例)。