在解析函数中像参数一样设置**kwargs
我正在使用Strawberry来处理GraphQL,搭配FastAPI和SQLAlchemy。我在MySQL里有大约20张表。我的模型是用SQLAlchemy来做的(继承DeclarativeBase
)。而对于Strawberry的模型,我则使用strawberry-sqlalchemy-mapper
。我可以写一个额外的模型层作为过滤器(@strawberry.input
),但这样听起来不太好。
我遇到了以下问题:
- 在客户端查询中,无法使用不确定的参数,因为必须在Strawberry的解析器(服务器端的
Query
)中为每个参数设置。 - 无法创建一个通用的过滤器类(基于
@strawberry.input
-> GPT生成的示例)。
我需要一些类似于上面图片中的代码,这样我就可以写带有一些参数的GraphQL查询,并且能顺利得到响应,而不会出错。我想获取一个像字典一样的客户端请求参数数据,并对其进行处理,而不是手动定义每个参数。我可以使用Info
对象,但Strawberry仍然不会跳过未定义的参数。
我还没有研究过Graphene或Ariadne的工作原理,不知道那边有没有解决这个问题的方法?
1 个回答
0
在strawberry中,这是可以实现的。你需要使用一些更底层的接口,模拟一下strawberry.field
是如何处理参数的。下面是一个简单的例子:
import strawberry
from strawberry.annotation import StrawberryAnnotation
from strawberry.arguments import StrawberryArgument
# no @strawberry.type yet
class Query:
@strawberry.field
def dynamic(self, **kwargs: object) -> list[str]:
return list(kwargs)
fields = {'x': int, 'y': str} # from a dynamic schema
Query.dynamic.base_resolver.arguments = [
StrawberryArgument(name, name, StrawberryAnnotation(fields[name])) for name in fields
]
schema = strawberry.Schema(strawberry.type(Query))
% strawberry export-schema ...
type Query {
dynamic(x: Int!, y: String!): [String!]!
}