Strawberry-FastAPI:如何控制函数与GraphQL字段的映射?
Strawberry GraphQL 命名映射与自定义方法
命名映射的实现位置
Strawberry 默认会把 Python 中的蛇形命名(如read_file)转为 GraphQL 规范的驼峰命名(如readFile),这个转换逻辑在**strawberry/utils/name_converter.py**文件的to_camel_case函数中实现,是框架内置的名称解析规则。
自定义命名的两种方式
1. 给单个 Mutation 显式指定名称
通过@strawberry.mutation装饰器的name参数,直接定义该方法在 GraphQL 中暴露的名称,完全自定义命名:
@strawberry.type class Mutation: @strawberry.mutation(name="read_typeA_pdf") async def read_type_a_pdf(self, file: Upload) -> str: # TypeA PDF 专属处理逻辑 return "Processing of TypeA PDF done!" @strawberry.mutation(name="read_typeB_pdf") async def read_type_b_pdf(self, file: Upload) -> str: # TypeB PDF 专属处理逻辑 return "Processing of TypeB PDF done!"
调用时直接使用指定的名称,比如 GraphQL 查询片段写read_typeA_pdf(file: $file)即可。
2. 全局自定义命名转换器
如果需要统一修改所有字段、Mutation 的命名规则,可以自定义名称转换器类替换默认实现:
from strawberry.name_converter import NameConverter from strawberry.schema.config import StrawberryConfig class CustomNameConverter(NameConverter): def to_graphql_name(self, name: str) -> str: # 示例:保持原蛇形命名不转换 return name # 创建 Schema 时指定自定义转换器 schema = strawberry.Schema( mutation=Mutation, config=StrawberryConfig(name_converter=CustomNameConverter()) )
这种方式会全局生效,所有 Python 端的命名都会按照你定义的规则映射到 GraphQL 中。
多读取方法的实现示例
结合显式命名的方式,你可以轻松创建多个针对不同文件类型的处理方法:
import typing import strawberry from strawberry.file_uploads import Upload @strawberry.type class Mutation: @strawberry.mutation(name="read_typeA_pdf") async def read_type_a_pdf(self, file: Upload) -> str: content = await file.read() # 这里添加 TypeA PDF 的校验、解析逻辑 return "TypeA PDF processed successfully!" @strawberry.mutation(name="read_typeB_pdf") async def read_type_b_pdf(self, file: Upload) -> str: content = await file.read() # 这里添加 TypeB PDF 的专属处理逻辑 return "TypeB PDF processed successfully!"
对应的 CURL 调用示例(以 TypeA 为例):
curl localhost:8000/graphql \ -F operations='{ "query": "mutation($file: Upload!){ read_typeA_pdf(file: $file) }", "variables": { "file": null } }' \ -F map='{ "file": ["variables.file"] }' \ -F file=@/path/to/typeA_file.pdf
内容的提问来源于stack exchange,提问作者easythrees
相关产品推荐
相关产品推荐

