【发布时间】:2020-11-24 16:25:54
【问题描述】:
我将石墨烯与 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 calculated column,但这也完全不同,因为在这里我不希望仅基于数据库字段进行计算(当前解决方案在涉及变量时不起作用,例如info.context['x'] 在这个玩具示例中)。
【问题讨论】:
-
这也是我的问题。问题是我们无法从顶层访问在较低级别生成的数据。
标签: sqlalchemy graphene-python graphene-sqlalchemy