Strawberry GraphQL嵌套字段过滤查询是否合规及实现方法
在Strawberry GraphQL + FastAPI中实现嵌套字段的过滤查询
1. 第一种查询模式是否被允许?
完全允许。GraphQL的核心特性之一就是支持给任意字段(包括嵌套字段)定义参数,用来实现字段级别的过滤、排序等逻辑,你的第一个查询示例是符合GraphQL规范的合法写法。
2. 在Strawberry中如何实现?
下面是完整的实现示例,包含枚举定义、类型声明、字段解析逻辑以及FastAPI整合:
步骤1:定义基础类型和枚举
import strawberry from typing import List, Optional # 定义宠物类型枚举 @strawberry.enum class PetType: DOG = "DOG" CAT = "CAT" BIRD = "BIRD" # 定义Pet类型 @strawberry.type class Pet: id: int name: str type: PetType # 定义User类型,重点是pets字段带参数 @strawberry.type class User: id: int name: str # 给pets字段添加过滤参数,resolver处理逻辑 @strawberry.field def pets(self, type: Optional[PetType] = None) -> List[Pet]: # 这里模拟从数据库/数据源获取当前用户的所有宠物 user_pets = [ Pet(id=1, name="旺财", type=PetType.DOG), Pet(id=2, name="咪咪", type=PetType.CAT), Pet(id=3, name="啾啾", type=PetType.BIRD), ] # 如果传入了type参数,过滤对应类型的宠物 if type: return [pet for pet in user_pets if pet.type == type] return user_pets
步骤2:定义Query根类型
@strawberry.type class Query: @strawberry.field def users(self) -> List[User]: # 模拟返回用户列表 return [ User(id=1, name="张三"), User(id=2, name="李四"), ] # 创建Strawberry schema schema = strawberry.Schema(query=Query)
步骤3:整合到FastAPI
from fastapi import FastAPI from strawberry.fastapi import GraphQLRouter app = FastAPI() graphql_app = GraphQLRouter(schema) app.include_router(graphql_app, prefix="/graphql")
验证查询
现在你就可以用你想要的第一种查询模式请求了:
query { users { pets(type: DOG) { name } } }
返回结果会只包含每个用户的狗狗宠物。
关键说明
- 嵌套字段的参数是在对应字段的resolver方法中定义的,
@strawberry.field装饰的方法可以接收自定义参数。 - resolver方法的第一个参数
self对应当前的父类型实例(这里是User对象),你可以基于这个实例的属性去关联查询对应的宠物数据(比如从数据库根据user_id查询)。 - 如果不需要过滤,参数可以设为可选(
Optional),默认返回全部数据。
内容的提问来源于stack exchange,提问作者Jan Zapał
相关产品推荐
相关产品推荐

