在 Strawberry 解析器中设置 kwargs 作为参数:解决参数传递和通用过滤问题
2024-03-05 12:24:25
在 Strawberry 解析器中设置 kwargs 作为参数
问题
当将 Strawberry 与 FastAPI 和 SQLAlchemy 结合使用时,可能会遇到两个问题:
- 无法在客户端查询中使用未确定的参数 ,除非在 Strawberry 解析器(服务器端“查询”)中设置每个参数。
- 无法创建通用的过滤器类 ,即使使用
@strawberry.input
也不行。
解决方案
为了解决这些问题,可以在 Strawberry 解析器函数中使用 **kwargs
参数接收 Pydantic 模型数据。以下是如何操作:
-
创建 Pydantic 模型: 使用
@strawberry.experimental.pydantic
装饰器为你的 Strawberry 模型创建 Pydantic 模型。 -
在解析器函数中接收 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 模型存储和检索数据。