Undine - GraphQL for Django
pip install undine
Documentation: https://undine-graphql.dev/
Documentation for LLMs: https://undine-graphql.dev/llms.txt
Contributing: https://undine-graphql.dev/contributing/
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 and DataLoaders
- Subscriptions with WebSockets, Server-Sent Events, or Multipart HTTP
- Apollo Federation v2 support
- Server-side query caching
- Optional persisted documents support
- Lifecycle hooks for customizing the GraphQL request cycle
- Hiding fields and types from schema
- Incremental delivery (experimental)
- Built-in testing tools
Check out the Tutorial to get started.
import asyncio
from collections.abc import AsyncIterator
from typing import Any
from undine import (
Entrypoint,
Field,
Filter,
FilterSet,
GQLInfo,
Input,
MutationType,
Order,
OrderSet,
QueryType,
RootType,
create_schema,
)
from undine.exceptions import GraphQLPermissionError, GraphQLValidationError
from undine.relay import Connection, Node
from undine.subscriptions import ModelCreateSubscription
from .models import Task
class TaskFilterSet(FilterSet[Task]):
name = Filter(lookup="icontains")
done = Filter()
class TaskOrderSet(OrderSet[Task]):
id = Order()
name = Order(null_placement="last")
@Node
@TaskFilterSet
@TaskOrderSet
class TaskType(QueryType[Task], schema_name="Task"):
pk = Field()
name = Field()
@name.permissions
def name_permissions(self, instance: Task, info: GQLInfo) -> None:
if not info.context.user.is_authenticated:
raise GraphQLPermissionError
class TaskCreateMutation(MutationType[Task]):
name = Input()
done = Input(default_value=False)
@classmethod
def __permissions__(cls, instance: Task, info: GQLInfo, input_data: dict[str, Any]) -> None:
if not info.context.user.is_staff:
msg = "Only staff members can create tasks"
raise GraphQLPermissionError(msg)
@classmethod
def __validate__(cls, instance: Task, info: GQLInfo, input_data: dict[str, Any]) -> None:
if len(input_data["name"]) < 3:
msg = "Task name must be at least 3 characters"
raise GraphQLValidationError(msg)
class Query(RootType):
node = Entrypoint(Node)
task = Entrypoint(TaskType, cache_time=10)
tasks = Entrypoint(Connection(TaskType))
class Mutation(RootType):
create_task = Entrypoint(TaskCreateMutation)
bulk_create_tasks = Entrypoint(TaskCreateMutation, many=True)
class Subscription(RootType):
task_created = Entrypoint(ModelCreateSubscription(TaskType))
@Entrypoint
async def countdown(self, info: GQLInfo) -> AsyncIterator[int]:
for i in range(10, -1, -1):
yield i
await asyncio.sleep(1)
schema = create_schema(query=Query, mutation=Mutation, subscription=Subscription)
Metadata
Release files for undine 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| undine-0.5.0.tar.gz | 290.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| undine-0.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 679.9 kB
Release files / undine-0.5.0.tar.gz
| Download URL | undine-0.5.0.tar.gz |
|---|---|
| Size | 290.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bf10679d175112f935c637f206a217009bf1c17d0d58c27f94bfacd09509c66d
|
|
BLAKE2b-256 checksum How to use checksums |
b5014b50cd0c1b36552f7830ee7078494d0093ec0e70451dc280e66f2761bb57
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / undine-0.5.0-py3-none-any.whl
| Download URL | undine-0.5.0-py3-none-any.whl |
|---|---|
| Size | 389.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c4f55a8425eb5e371c050825b23d1c94ad0a34b819e46af42e8194d423f24f9f
|
|
BLAKE2b-256 checksum How to use checksums |
195db115a7a54e899cacab4c17f72c6f70a2d586ba286373cbeffbc1090c98a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|