Queries
In GraphQL you use queries to fetch data from a server. In Strawberry you can define the data your server provides by defining query types.
By default all the fields the API exposes are nested under a root Query type.
This is how you define a root query type in Strawberry:
@strawberry.typeclass Query: name: str
schema = strawberry.Schema(query=Query) This creates a schema where the root type Query has one single field called name.
As you notice we donβt provide a way to fetch data. In order to do so we need to
provide a resolver , a function that knows how to fetch data for a specific
field.
For example in this case we could have a function that always returns the same name:
def get_name() -> str: return "Strawberry"
@strawberry.typeclass Query: name: str = strawberry.field(resolver=get_name)
schema = strawberry.Schema(query=Query) So now, when requesting the name field, the get_name function will be called.
Alternatively a field can be declared using a decorator:
@strawberry.typeclass Query: @strawberry.field def name(self) -> str: return "Strawberry" The decorator syntax supports specifying a graphql_type for cases when the
return type of the function does not match the GraphQL type:
class User: id: str name: str
def __init__(self, id: str, name: str): self.id = id self.name = name
@strawberry.type(name="User")class UserType: id: strawberry.ID name: str
@strawberry.typeclass Query: @strawberry.field(graphql_type=UserType) def user(self) -> User return User(id="ringo", name="Ringo") Arguments
GraphQL fields can accept arguments, usually to filter out or retrieve specific objects:
FRUITS = [ "Strawberry", "Apple", "Orange",]
@strawberry.typeclass Query: @strawberry.field def fruit(self, startswith: str) -> str | None: for fruit in FRUITS: if fruit.startswith(startswith): return fruit return None Argument Descriptions
Use Annotated to give a field argument a description:
from typing import Annotatedimport strawberry
@strawberry.typeclass Query: @strawberry.field def fruit( self, startswith: Annotated[ str, strawberry.argument(description="Prefix to filter fruits by.") ], ) -> str | None: ... Argument Types
As with fields, strawberry.argument supports specifying a graphql_type for
cases when the argument type of the function does not match the GraphQL type.
This can be useful for static typing, as custom scalars are not valid type
annotations.
BigInt = strawberry.scalar( int, name="BigInt", serialize=lambda v: str(v), parse_value=lambda v: int(v))
@strawberry.typeclass Query: @strawberry.field def users( self, ids: Annotated[list[int], strawberry.argument(graphql_type=list[BigInt])], ) -> list[User]: ...