Undine🔗

Coverage Status GitHub Workflow Status PyPI GitHub GitHub Last Commit GitHub Issues Downloads Python Version Django Version

pip install undine

Undine is a GraphQL library for Django. It's designed to be easy to use and extend while providing out-of-the-box solutions for many common issues GraphQL developers face.

Feature highlights:

  • Automatic generation of GraphQL types from Django models
  • Automatic query optimization
  • Logically composable filtering
  • Ordering based on enums
  • Single and bulk mutations, including relations
  • Hidden and input-only mutation inputs
  • Built-in permission and validation hooks
  • Support for Relay Global object IDs and Connection pagination
  • File uploads based on GraphQL multipart request specification
  • Support for asynchronous execution
  • Optional persisted documents support
  • Lifecycle hooks for customizing the GraphQL request cycle
  • Built-in testing tools
from typing import Any

from undine import Entrypoint, FilterSet, GQLInfo, MutationType, OrderSet, QueryType, RootType, create_schema
from undine.exceptions import GraphQLPermissionError
from undine.relay import Connection

from .models import Task


class TaskFilterSet(FilterSet[Task]): ...


class TaskOrderSet(OrderSet[Task]): ...


class TaskType(QueryType[Task], filterset=TaskFilterSet, orderset=TaskOrderSet): ...


class TaskCreateMutation(MutationType[Task]):
    @classmethod
    def __permissions__(cls, instance: Task, info: GQLInfo, input_data: dict[str, Any]) -> None:
        if not info.context.user.is_staff:
            raise GraphQLPermissionError


class Query(RootType):
    task = Entrypoint(TaskType)
    tasks = Entrypoint(Connection(TaskType))


class Mutation(RootType):
    create_task = Entrypoint(TaskCreateMutation)
    bulk_create_tasks = Entrypoint(TaskCreateMutation, many=True)


schema = create_schema(query=Query, mutation=Mutation)