You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:55:17