/graphene-django-optimizer

Optimize database access inside graphene queries

Primary LanguagePythonMIT LicenseMIT

graphene-django-optimizer

Optimize queries executed by graphene-django automatically, using select_related, prefetch_related and only methods of Django QuerySet.

Install

pip install graphene-django-optimizer

Usage

Having the following schema based on the tutorial of graphene-django (notice the use of gql_optimizer)

# cookbook/ingredients/schema.py
import graphene

from graphene_django.types import DjangoObjectType
import graphene_django_optimizer as gql_optimizer

from cookbook.ingredients.models import Category, Ingredient


class CategoryType(DjangoObjectType):
    class Meta:
        model = Category


class IngredientType(DjangoObjectType):
    class Meta:
        model = Ingredient


class Query(object):
    all_categories = graphene.List(CategoryType)
    all_ingredients = graphene.List(IngredientType)

    def resolve_all_categories(root, info):
        return gql_optimizer.query(Category.objects.all(), info)

    def resolve_all_ingredients(root, info):
        return gql_optimizer.query(Ingredient.objects.all(), info)

We will show some graphql queries and the queryset that will be executed.

Fetching all the ingredients with the related category:

{
  all_ingredients {
    id
    name
    category {
        id
        name
    }
  }
}
# optimized queryset:
ingredients = (
    Ingredient.objects
    .select_related('category')
    .only('id', 'name', 'category__id', 'category__name')
)

Fetching all the categories with the related ingredients:

{
  all_categories {
    id
    name
    ingredients {
        id
        name
    }
  }
}
# optimized queryset:
categories = (
    Category.objects
    .only('id', 'name')
    .prefetch_related(Prefetch(
        'ingredients',
        queryset=Ingredient.objects.only('id', 'name'),
    ))
)