Schema Directives

Strawberry supports schema directives , which are directives that don’t change the behavior of your GraphQL schema but instead provide a way to add additional metadata to it.

For example our Apollo Federation integration is based on schema directives.

Let’s see how you can implement a schema directive in Strawberry, here we are creating a directive called keys that can be applied to Object types definitions and accepts one parameter called fields . Note that directive names, by default, are converted to camelCase on the GraphQL schema.

Here’s how we can use it in our schema:

import strawberry
from strawberry.schema_directive import Location
 
 
@strawberry.schema_directive(locations=[Location.OBJECT])
class Keys:
    fields: str
 
 
from .directives import Keys
 
 
@strawberry.type(directives=[Keys(fields="id")])
class User:
    id: strawberry.ID
    name: str

This will result in the following schema:

type User @keys(fields: "id") {
  id: ID!
  name: String!
}

Overriding field names

You can use strawberry.directive_field to override the name of a field:

@strawberry.schema_directive(locations=[Location.OBJECT])
class Keys:
    fields: str = strawberry.directive_field(name="as")

Locations

Schema directives can be applied to many different parts of a schema. Here's the list of all the allowed locations:

Name Description
SCHEMA strawberry.Schema The definition of a schema
SCALAR strawberry.scalar The definition of a scalar
OBJECT strawberry.type The definition of an object type
FIELD_DEFINITION strawberry.field The definition of a field on an object type or interface
ARGUMENT_DEFINITION strawberry.argument The definition of an argument
INTERFACE strawberry.interface The definition of an interface
UNION strawberry.union The definition of an union
ENUM strawberry.enum The definition of a enum
ENUM_VALUE strawberry.enum_value The definition of a enum value
INPUT_OBJECT strawberry.input The definition of an input object type
INPUT_FIELD_DEFINITION strawberry.field The definition of a field on an input type
Edit this page on GitHub