返回

在 Strawberry 解析器中设置 kwargs 作为参数:解决参数传递和通用过滤问题

python

在 Strawberry 解析器中设置 kwargs 作为参数

问题

当将 Strawberry 与 FastAPI 和 SQLAlchemy 结合使用时,可能会遇到两个问题:

  1. 无法在客户端查询中使用未确定的参数 ,除非在 Strawberry 解析器(服务器端“查询”)中设置每个参数。
  2. 无法创建通用的过滤器类 ,即使使用 @strawberry.input 也不行。

解决方案

为了解决这些问题,可以在 Strawberry 解析器函数中使用 **kwargs 参数接收 Pydantic 模型数据。以下是如何操作:

  1. 创建 Pydantic 模型: 使用 @strawberry.experimental.pydantic 装饰器为你的 Strawberry 模型创建 Pydantic 模型。

  2. 在解析器函数中接收 kwargs: 在 Strawberry 解析器函数中,使用 **kwargs 参数接收 Pydantic 模型数据。

这样,你就可以在客户端查询中传递任意数量的参数,并且在 Strawberry 解析器中接收这些参数作为 Pydantic 模型数据。

代码示例

# 创建 Pydantic 模型
from strawberry.experimental.pydantic import model
from pydantic import BaseModel

class MyModel(BaseModel):
    name: str
    age: int

# Strawberry 解析器函数
@strawberry.type
class Query:
    @strawberry.field
    def get_my_model(self, model: MyModel = None) -> MyModel:
        # 处理来自客户端的 Pydantic 模型数据
        return model

优点

使用此方法具有以下优点:

  • 允许在客户端查询中使用未确定的参数。
  • 能够创建通用的过滤器类。
  • 简化了解析器函数。

常见问题解答

1. 是否可以通过 Info 对象访问客户端请求参数?

是的,但 Strawberry 仍然不会跳过未定义的参数。

2. Graphene 或 Ariadne 中是否有解决此问题的替代方法?

在 Graphene 和 Ariadne 中可以使用类似的技术。

3. 是否可以将此方法与其他 Strawberry 功能结合使用?

是的,此方法可以与 Strawberry 的其他功能结合使用,例如输入类型和验证。

4. 此方法是否适用于所有 Strawberry 模型?

此方法适用于使用 @strawberry.experimental.pydantic 装饰器创建的所有 Strawberry 模型。

5. 是否有其他使用 Pydantic 模型和 Strawberry 的提示?

使用 Pydantic 模型和 Strawberry 时,请考虑以下提示:

  • 使用 Pydantic 模型验证客户端输入。
  • 使用 Pydantic 模型创建 Strawberry 输入类型。
  • 使用 Pydantic 模型存储和检索数据。