Estou construindo uma API usando Strawberry GraphQL e FastAPI. Eu estava pensando em fornecer consulta com filtros anexados ao campo aninhado, por exemplo:
query {
users {
pets(type: DOG) {
name
}
}
Não consegui encontrar uma maneira de implementá-lo. Vi exemplos em que problemas semelhantes foram resolvidos com filtro no nível superior, como:
query {
users(where: {pets: {type: DOG}) {
pets(type: DOG) {
name
}
}
A primeira consulta é um padrão permitido no GraphQL? Se sim, como pode ser implementado no Strawberry?
No GraphQL, o primeiro padrão de consulta que você mencionou — filtrar campos aninhados diretamente — normalmente não é suportado de imediato. As consultas GraphQL geralmente são projetadas para especificar filtros no nível superior. No entanto, você pode implementar funcionalidade semelhante em sua API projetando seu esquema cuidadosamente e usando resolvedores.
Veja como você pode implementar uma solução para sua configuração FastAPI e Strawberry GraphQL:
Etapa 1: Defina seus modelos
Supondo que você tenha modelos de Usuário e Animal de Estimação, você pode começar com algo assim:
Etapa 2: Defina seu tipo de consulta
Em seguida, crie um tipo de consulta que inclua um resolvedor para usuários e seus animais de estimação:
Etapa 3: Atualizar o esquema
Por fim, você pode criar seu esquema e integrá-lo ao FastAPI:
Exemplo de consulta
Com essa configuração, agora você pode consultar usuários e filtrar seus animais de estimação por tipo no nível superior, assim:
Filtragem no nível superior: como o GraphQL não oferece suporte à filtragem de campos aninhados diretamente na consulta, fornecemos um parâmetro de tipo no resolvedor do usuário.
Resolvedores dinâmicos: o resolver filtra os animais de estimação com base no tipo fornecido antes de retornar os usuários.
Este método adere às melhores práticas do GraphQL, ao mesmo tempo em que permite que você alcance o efeito de filtragem desejado. Se você quiser uma filtragem aninhada mais complexa, talvez precise expandir seus parâmetros de consulta e lógica de acordo.