Skip to content

Fields

Graphene-Django-Extras provides several field types for building GraphQL schemas with enhanced functionality.

DjangoObjectField

Used for single object queries with automatic ID filtering.

from graphene_django_extras import DjangoObjectField
from .types import UserType

class Query(graphene.ObjectType):
    user = DjangoObjectField(UserType, description='Single User query')

Features: - Automatic ID-based filtering - No need to define custom resolve function - Built-in error handling for non-existent objects

Usage in GraphQL:

{
  user(id: 1) {
    id
    username
    firstName
  }
}

DjangoFilterListField

Provides filtering capabilities for list queries without pagination.

from graphene_django_extras import DjangoFilterListField
from .types import UserType

class Query(graphene.ObjectType):
    users = DjangoFilterListField(UserType)

Features: - Django-filter integration - Multiple filter types (exact, contains, etc.) - No pagination (returns all matching results)

Usage in GraphQL:

{
  users(firstName_Icontains: "john") {
    id
    username
    firstName
    lastName
  }
}

DjangoFilterPaginateListField

Combines filtering and pagination for list queries.

from graphene_django_extras import DjangoFilterPaginateListField
from graphene_django_extras.paginations import LimitOffsetGraphqlPagination
from .types import UserType

class Query(graphene.ObjectType):
    users = DjangoFilterPaginateListField(
        UserType, 
        pagination=LimitOffsetGraphqlPagination(default_limit=20)
    )

Features: - All filtering capabilities of DjangoFilterListField - Built-in pagination support - Configurable pagination class

Usage in GraphQL:

{
  users(firstName_Icontains: "john", limit: 10, offset: 0) {
    results {
      id
      username
      firstName
    }
    totalCount
  }
}

DjangoListObjectField

Recommended for Queries

This is the most flexible approach for list queries with built-in support for filtering and pagination.

from graphene_django_extras import DjangoListObjectField
from .types import UserListType

class Query(graphene.ObjectType):
    users = DjangoListObjectField(UserListType, description='All Users query')

Features: - Works with DjangoListObjectType - Inherits pagination configuration from the type - Support for custom FilterSet classes - Built-in caching support

Usage in GraphQL:

{
  users(limit: 10, offset: 0) {
    results {
      id
      username
      firstName
    }
    totalCount
  }
}

With Custom FilterSet

import django_filters
from django.contrib.auth.models import User

class UserFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(method='filter_by_name')

    class Meta:
        model = User
        fields = ['username', 'email']

    def filter_by_name(self, queryset, name, value):
        return queryset.filter(
            Q(first_name__icontains=value) | Q(last_name__icontains=value)
        )

class Query(graphene.ObjectType):
    users = DjangoListObjectField(
        UserListType, 
        filterset_class=UserFilter,
        description='Users with custom filtering'
    )

Field Comparison

Feature DjangoObjectField DjangoFilterListField DjangoFilterPaginateListField DjangoListObjectField
Single Objects
List Objects
Filtering ID only
Pagination
Custom FilterSet
Type Integration Basic Basic Basic Full
Caching

Best Practices

1. Use DjangoListObjectField for Lists

# ✅ Recommended
class Query(graphene.ObjectType):
    users = DjangoListObjectField(UserListType, description='All users')

# ❌ Less flexible
class Query(graphene.ObjectType):
    users = DjangoFilterPaginateListField(UserType)

2. Define Filter Fields in Types

class UserType(DjangoObjectType):
    class Meta:
        model = User
        filter_fields = {
            "username": ("exact", "icontains"),
            "email": ("exact", "icontains"),
            "is_active": ("exact",),
        }

3. Use Descriptive Names

class Query(graphene.ObjectType):
    # ✅ Clear and descriptive
    active_users = DjangoListObjectField(
        UserListType, 
        description='List of active users with pagination'
    )

    user_by_id = DjangoObjectField(
        UserType, 
        description='Get a single user by ID'
    )

4. Combine with Permissions

from graphene_django_extras import DjangoListObjectField

class Query(graphene.ObjectType):
    users = DjangoListObjectField(UserListType)

    def resolve_users(self, info, **kwargs):
        if not info.context.user.is_staff:
            raise PermissionError("Staff access required")
        return super().resolve_users(info, **kwargs)