Quick Start¶
This guide will help you get started with graphene-django-extras quickly.
Configuration¶
Configure global settings for pagination in your Django settings:
settings.py
GRAPHENE_DJANGO_EXTRAS = {
'DEFAULT_PAGINATION_CLASS': 'graphene_django_extras.paginations.LimitOffsetGraphqlPagination',
'DEFAULT_PAGE_SIZE': 20,
'MAX_PAGE_SIZE': 50,
'CACHE_ACTIVE': True,
'CACHE_TIMEOUT': 300 # seconds
}
Types Definition¶
Basic Type¶
types.py
from django.contrib.auth.models import User
from graphene_django_extras import DjangoObjectType
class UserType(DjangoObjectType):
class Meta:
model = User
description = "Type definition for a single user"
filter_fields = {
"id": ("exact", ),
"first_name": ("icontains", "iexact"),
"last_name": ("icontains", "iexact"),
"username": ("icontains", "iexact"),
"email": ("icontains", "iexact"),
"is_staff": ("exact", ),
}
List Type with Pagination¶
types.py
from graphene_django_extras import DjangoListObjectType
from graphene_django_extras.paginations import LimitOffsetGraphqlPagination
class UserListType(DjangoListObjectType):
class Meta:
description = "Type definition for user list"
model = User
pagination = LimitOffsetGraphqlPagination(
default_limit=25,
ordering="-username" # Can be string, tuple, or list
)
Serializer Type¶
types.py
from graphene_django_extras import DjangoSerializerType
from .serializers import UserSerializer
class UserModelType(DjangoSerializerType):
"""With this type definition, mutations are auto-generated"""
class Meta:
description = "User model type definition"
serializer_class = UserSerializer
pagination = LimitOffsetGraphqlPagination(
default_limit=25,
ordering="-username"
)
filter_fields = {
"id": ("exact", ),
"first_name": ("icontains", "iexact"),
"last_name": ("icontains", "iexact"),
"username": ("icontains", "iexact"),
"email": ("icontains", "iexact"),
"is_staff": ("exact", ),
}
Input Types¶
Define input types for mutations:
inputs.py
from graphene_django_extras import DjangoInputObjectType
from django.contrib.auth.models import User
class UserInput(DjangoInputObjectType):
class Meta:
description = "User InputType definition for mutations"
model = User
Mutations¶
Serializer-based Mutations¶
Recommended Approach
DjangoSerializerMutation automatically implements Create, Delete and Update functions.
mutations.py
from graphene_django_extras import DjangoSerializerMutation
from .serializers import UserSerializer
class UserSerializerMutation(DjangoSerializerMutation):
class Meta:
description = "DRF serializer based Mutation for Users"
serializer_class = UserSerializer
Traditional Mutations¶
mutations.py
import graphene
from .types import UserType
from .inputs import UserInput
class UserMutation(graphene.Mutation):
"""Traditional mutation - requires implementing mutate function"""
user = graphene.Field(UserType, required=False)
class Arguments:
new_user = graphene.Argument(UserInput)
class Meta:
description = "Graphene traditional mutation for Users"
@classmethod
def mutate(cls, root, info, *args, **kwargs):
# Implement your mutation logic here
pass
Schema Definition¶
schema.py
import graphene
from graphene_django_extras import (
DjangoObjectField,
DjangoListObjectField,
DjangoFilterPaginateListField,
DjangoFilterListField,
LimitOffsetGraphqlPagination
)
from .types import UserType, UserListType, UserModelType
from .mutations import UserMutation, UserSerializerMutation
class Query(graphene.ObjectType):
# Different ways to define user list queries
users = DjangoListObjectField(UserListType, description='All Users query')
users_paginated = DjangoFilterPaginateListField(
UserType,
pagination=LimitOffsetGraphqlPagination()
)
users_filtered = DjangoFilterListField(UserType)
# Single user queries
user = DjangoObjectField(UserType, description='Single User query')
user_detail = UserListType.RetrieveField(description='User detail')
# Using DjangoSerializerType
user_retrieve, user_list = UserModelType.QueryFields(
description='User queries with serializer type'
)
class Mutation(graphene.ObjectType):
# Serializer-based mutations
user_create = UserSerializerMutation.CreateField()
user_delete = UserSerializerMutation.DeleteField()
user_update = UserSerializerMutation.UpdateField()
# Using DjangoSerializerType
user_create_alt, user_delete_alt, user_update_alt = UserModelType.MutationFields()
# Traditional mutation
traditional_user_mutation = UserMutation.Field()
schema = graphene.Schema(query=Query, mutation=Mutation)
Example Queries¶
Example Mutations¶
Next Steps¶
- Learn more about Fields
- Explore Pagination options
- Discover Directives for data formatting
- Check out more Examples