在解析函数中像参数一样设置**kwargs

-2 投票
1 回答
60 浏览
提问于 2025-04-14 15:24

我正在使用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!]!
}

撰写回答