我已经成功构建了一个允许嵌套查询的GraphQL API。使用国家和通用的通用示例状态,我可以执行这样的查询:
query{
country(id:"Q291bnRyeTo0Nw==") {
states {
edges {
node {
id,
name,
area,
population
}
}
}
}
}
我发现我似乎无法做到的是:
query{
country(id:"Q291bnRyeTo0Nw==") {
state(id:"U3RhdGU6MzM=") {
edges {
node {
id,
name,
area,
population
}
}
}
}
}
可以通过GraphQL在一个查询中指定特定的父级和特定子级吗?
罗伯特
更新:为了Daniel的好处,这是我当前的GraphQL查询代码:
from .models import Country as CountryModel
from .models import State as StateModel
class Query(graphene.AbstractType):
country = graphene.Field(Country, id=graphene.String())
countries = graphene.List(Country)
state = graphene.Field(State, id=graphene.String())
states = graphene.List(State)
def resolve_country(self, args, context, info):
id = args.get('id')
if id is not None:
return CountryModel.objects.get(id=Schema.decode(id))
return None
def resolve_countries(self, args, context, info):
return CountryModel.objects.all()
def resolve_state(self, args, context, info):
id = args.get('id')
if id is not None:
return StateModel.objects.get(id=Schema.decode(id))
return None
def resolve_states(self, args, context, info):
return StateModel.objects.all()
答案 0 :(得分:4)
您需要为根查询中的country
字段和国家/地区类型上的state
字段定义解析程序。以下是您可以复制并粘贴到Launchpad并查看其实际效果的示例。
Graphene之类的设置会有所不同,但想法是一样的:country
查询返回的对象可供state
下每个字段的解析器使用类型。您使用传递给id
字段的state
参数来过滤该对象上的数据(在此示例中,返回的对象具有states
属性)并返回适当的状态。
import { makeExecutableSchema } from 'graphql-tools';
const countries = [
{
id: 1,
name: 'bar',
states: [
{
name: 'foo',
id: 20
}
]
},
{ id: 2 },
];
const typeDefs = `
type Query {
country(id: Int!): Country
}
type Country {
id: Int
state(id: Int!): State
}
type State {
id: Int
name: String
}
`
const resolvers = {
Query: {
country: (obj, args, context) => {
return countries.find(country => country.id === args.id)
},
},
Country: {
state: (obj, args, context) => {
return obj.states.find(state => state.id === args.id)
},
}
}
export const schema = makeExecutableSchema({
typeDefs,
resolvers,
})
修改:假设CountryModel.objects.get(id=Schema.decode(id))
返回的对象包含一个状态列表的states
属性,您应该可以执行以下操作:
class Country(graphene.ObjectType):
state = graphene.Field(State,
id=graphene.String()
)
# other fields
def resolve_state(self, args, context, info):
id = args.get('id')
if id is not None:
return list(filter(lambda x: x.id == id, self.states)
return None